HDU 1028(Ignatius and the Princess III)区间DP之整数划分

来源:互联网 发布:三滴水一个乎 编辑:程序博客网 时间:2024/06/16 06:03

区间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;        }


0 0