动态规划入门——Function Run Fun

转载请注明出处:http://blog.csdn.net/a1dark

分析:递推公式已经给出了、但是如果直接递归实现的话、必然会超时、所以我们预处理一下、根据公式、DP出所有答案、

#include<stdio.h>
#include<string.h>
int dp[25][25][25];
int fun(int a,int b,int c){
    if(a<=0||b<=0||c<=0)return 1;
    else return dp[a][b][c];
}
void init(){
    for(int i=1;i<=20;i++){
        for(int j=1;j<=20;j++){
            for(int k=1;k<=20;k++){
                if(i<j&&j<k)
                    dp[i][j][k]=fun(i,j,k-1)+fun(i,j-1,k-1)-fun(i,j-1,k);
                else
                    dp[i][j][k]=fun(i-1,j,k)+fun(i-1,j-1,k)+fun(i-1,j,k-1)-fun(i-1,j-1,k-1);
            }
        }
    }
}
int solve(int a,int b,int c){
    if(a<=0||b<=0||c<=0)return 1;
    else if(a>20||b>20||c>20)return dp[20][20][20];
    else return dp[a][b][c];
}
int main(){
    int x,y,z;
    init();
    while(scanf("%d%d%d",&x,&y,&z)!=EOF){
        if(x==-1&&y==-1&&z==-1)break;
        dp[20][20][20]=1048576;
        printf("w(%d, %d, %d) = %d\n",x,y,z,solve(x,y,z));
    }
    return 0;
}



你可能感兴趣的:(ACM,动态规划入门)