hdu 1028

来源:互联网 发布:mac同时显示两个窗口 编辑:程序博客网 时间:2024/05/07 05:49

题意:将1个整数划分,有多少种划分方法。

状态:dp[i][j] 表示i划分中最大的元素是j的方案数。

状态转移:

if(i!=j)dp[i][j]=dp[i-j][j]+dp[i-1][j-1];
因为含有j的方案数只与之前有j的方案数dp[i-j][j],和之前没有j的方案数有关。那么没有j的怎么转换为有j的呢?只要前面的j-1加1就能转化过来那么久是从dp[i-1][j-1]转移过来即可。
Run IDSubmit TimeJudge StatusPro.IDExe.TimeExe.MemoryCode Len.LanguageAuthor45291062011-09-01 22:31:42Accepted10280MS292K479 BC++xym2010
#include<cstdio>#include<cstring>#include<string>#include<iostream>#include<cmath>#include<algorithm>using namespace std;int dp[125][125],ans[125];int main(){int n;for(int i=0;i<121;i++){dp[i][i]=1;}for(int i=1;i<121;i++){for(int j=1;j<=i;j++){if(i!=j)dp[i][j]=dp[i-j][j]+dp[i-1][j-1];ans[i]+=dp[i][j];}}while(scanf("%d",&n)!=EOF){printf("%d\n",ans[n]);}return 0;}


原创粉丝点击