区间DP整数划分题,自己的区间DP比较菜,云里雾里,方程不会推。
一看题就知道要打表了,n=120.
当n<m时,由于分法不可能出现负数,所以record[n][m]=record[n][n];
当n==m时,那么就得分析是否要分出m这一个数,如果要分那就只有一种{m},要是不分,那就是把n分成不大于m-1的若干份;即record[n][n]=1+record[n][n-1];
当n>m时,那么就得分析是否要分出m这一个数,如果要分那就{{m},{x1,x2,x3..}}时n-m的分法record[n-m][m],要是不分,那就是把n分成不大于m-1的若干份;
即record[n][n]=record[n-m][m]+record[n][m-1];
这是看了别人的解题报告的,哎。
record[i][j]代表,分解第i个数最大数为j的分法数量,j>i,当然和record[i][i]相同了,i不能分解成j+某个数了。
代码:
#include<stdio.h>
#include<string.h>
int dp[125][125];
int main()
{
int i,j,n;
for(i=1;i<=120;i++)
{
dp[1][i]=1;
dp[i][1]=1;
dp[0][i]=1;
}
for(i=2;i<=120;i++)
{
for(j=2;j<=120;j++)
{
if(j>i) dp[i][j]=dp[i][i];
else
{
dp[i][j]=dp[i-j][j]+dp[i][j-1];
}
}
}
while(scanf("%d",&n)!=EOF)
{
printf("%d\n",dp[n][n]);
}
return 0;
}