POJ 1579To the Max

遇到这种题目的时候,用一个数组储存查询的结果,并且在搜索的如果遇到储存过的数值,直接返回结果就行。

#include<stdio.h>
#include<string.h>
int kj[21][21][21];
int w(int a,int b,int c)
{
    if(kj[a][b][c])
        return kj[a][b][c];
    if(a<=0||b<=0||c<=0)
        return 1;
    else if(a>20||b>20||c>20)
        return w(20,20,20);
    else if(a<b&&b<c)
        return w(a, b, c-1) + w(a, b-1, c-1) - w(a, b-1, c);
        else
                   return 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()
{

    for(int i=0;i<=20;i++)
        for(int j=0;j<=20;j++)
            for(int k=0;k<=20;k++)
                kj[i][j][k]=w(i,j,k);
    int a,b,c;
    while(scanf("%d%d%d",&a,&b,&c)!=EOF)
    { if(a==-1&&b==-1&&c==-1)
            break;
        printf("w(%d, %d, %d) = ",a,b,c);
       
        if(a<0||b<0||c<0)
            printf("1\n");
        else if(a>20||b>20||c>20)
            printf("%d\n",kj[20][20][20]);
        else
            printf("%d\n",kj[a][b][c]);
    }
    return 0;
}


你可能感兴趣的:(POJ 1579To the Max)