二维DP

我感觉DP最重要就是找到递推公式和截止点

ans[i][j]表是n为i 时 组合成i的若干个数中最大为j(至少有一个为j)的 种数

不知数据多大 直接用了64位

 

http://acm.hdu.edu.cn/showproblem.php?pid=1028

#include<iostream>
#include<string.h>
#include<algorithm>
#include<stdio.h>

using namespace std;

__int64 ans[121][121];
__int64 dp(int i,int j)
{
    if(ans[i][j]!=-1)//第 1 种情况 

    return ans[i][j];
    if(i<j)//第 2 种情况
    {
        ans[i][j]=0;
        return ans[i][j];
    }
    if(i==j)//第三种情况
    {
        ans[i][j]=1;
        return ans[i][j];
    }
    if(i>j)//第四种情况 重点
    {
        ans[i][j]=0;
        for(int w=1;w<=j;w++)
        ans[i][j]+=dp(i-j,w);
        return ans[i][j];
    }
}
int main()
{
    int n,i;
    __int64 T;
    while(cin>>n)
    {
        memset(ans,-1,sizeof(ans));
        T=0;
        for(i=1;i<=n;i++)
        T+=dp(n,i);
        printf("%I64d\n",T);
    }
    return 0;
}

 

posted on 2011-11-23 20:24  夜->  阅读(145)  评论(0编辑  收藏  举报