HDU 1331 Function Run Fun

这道题是把题目给你的好像是递归的方式改变成 递推的方式, 只要预处理一下,答案就直接全部出来了


#include<algorithm>
#include<iostream>
#include<cstdio>
using namespace std;
int dp[22][22][22];
//w(a-1, b, c) + w(a-1, b-1, c) + w(a-1, b, c-1) - w(a-1, b-1, c-1)
int main()
{
    int a, b, c, i, j, k;
    for(i=0;i<=20;i++)//初始化
        for(j=0;j<=20;j++)
        {
            dp[i][j][0]=dp[0][i][j]=dp[i][0][j]=1;
            dp[j][i][0]=dp[0][j][i]=dp[j][0][i]=1;
        }
    for(i=1;i<=20;i++)//计算答案
        for(j=1;j<=20;j++)
            for(k=1;k<=20;k++)
            {
                if(i<j&&j<k)
                    dp[i][j][k]=dp[i][j][k-1]+dp[i][j-1][k-1]-dp[i][j-1][k];
                else
                    dp[i][j][k]=dp[i-1][j][k]+dp[i-1][j-1][k]+dp[i-1][j][k-1]-dp[i-1][j-1][k-1];
            }
    int ta, tb, tc;
    while(scanf("%d%d%d",&a,&b,&c)!=EOF)
    {
        if(a==-1&&b==-1&&c==-1) break;
        ta=a, tb=b, tc=c;
         if(a<=0||b<=0||c<=0)//刚开始判断小于等于0的条件和大于20的条件位置不对就错了,换回来就对了
            a=b=c=0;
        if(a>20||b>20||c>20)
            a=b=c=20;
        printf("w(%d, %d, %d) = %d\n",ta,tb,tc,dp[a][b][c]);
    }
    return 0;
}


posted @ 2013-08-15 20:33  Ink_syk  阅读(98)  评论(0编辑  收藏  举报