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