OpenJudge(复杂整数的划分问题)

链接:https://vjudge.net/problem/OpenJ_Bailian-4119
思路:这个题一共有三个小问,均可以用同一个类似的状态转移,即如果分的数里面有1,则减去1,如果没有,则减去数字的个数(相当于每个数减一),从而有dp[i][j]=dp[i-j][j]+dp[i-1][j-1]

代码:

#include<iostream>
#include<cstring>
using namespace std;

const int maxn = 51;
int n,k;
long long int dp1[maxn][maxn],dp2[maxn][maxn],dp3[maxn][maxn];

int main(){
    while(cin>>n>>k){
   
    memset(dp1,0,sizeof(dp1));
    for(int i=1;i<=n;i++){
        dp1[i][1] = 1;
    }

//这里的j表示相加数字的个数总和
    for(int i=1;i<=n;i++){
        for(int j=2;j<=i;j++){
            dp1[i][j] = dp1[i-j][j] + dp1[i-1][j-1];
        }    
    }

//这里j表示相加数字的个数总和的上限
    memset(dp2,0,sizeof(dp2));
    dp2[0][0] = 1;
    for(int i=0;i<=n;i++){
        for(int j=1;j<=n;j++){
            if(j<=i)dp2[i][j] = dp2[i-j][j-1]+dp2[i][j-1];
            else dp2[i][j] = dp2[i][i];
        }
    }

//这里j的意思同第二个
    memset(dp3,0,sizeof(dp3));
for(int i=0;i<=n;++i)
    {
        dp3[i][1]=1;        
        if(i&1)dp3[0][i]=1;
    }
    
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            if(j&1)
            {
                if(j<=i)dp3[i][j]=dp3[i-j][j]+dp3[i][j-1];
                else dp3[i][j]=dp3[i][i];
            }
            else dp3[i][j]=dp3[i][j-1];
        }
    }
    cout<<dp1[n][k]<<endl<<dp2[n][n]<<endl<<dp3[n][n]<<endl;
    }
    return 0;
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 动态规划(Dynamic Programming) 本文包括: 动态规划定义 状态转移方程 动态规划算法步骤 最长...
    廖少少阅读 8,861评论 0 18
  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 14,354评论 0 33
  • 各校历年复试机试试题 清华、北大、华科试题详细笔记部分,少笔记部分与少数leetcode【含个人整理笔记】 一、详...
    医学工程与科学园地阅读 4,983评论 0 1
  • 浴室里弥漫着水汽,将这一小块光滑的空间显著地温暖。 熏香并不是这边地区常用的,不过昨天长谷部偶然在仓库里发现了舶来...
    hskr阅读 2,817评论 0 0
  • 最佳药引:苍蝇的挣扎,有你也有他 十一假期回老家休息,有天,晴空万里,闲来无事,盯着面前一张黏苍蝇贴纸观...
    紫竹阅读 3,365评论 14 6

友情链接更多精彩内容