Function Run Fun(记忆化)

VJ链接

题意:简单的模拟递归,不需解释。

做法:通过对数据进行分析可得,w(n,m,c)当n=m=c时会返回会返回pow(2,n),所以可以w(20,20,20)进行单独特判。其次,可以开一个三位数组记录下来已经计算过的w(a,b,c)的值,能够节省时间。也就是所谓记忆化。

注意:记忆数组只要开到20即可

代码

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int W[21][21][21];
int s=1048576;
int w(int a,int b,int c)
{
    if(a<=0||b<=0||c<=0) return 1;
    if(a>20||b>20||c>20) return s;
    if(W[a][b][c]>0) return W[a][b][c];
    if(a<b&&b<c)
        return W[a][b][c]=w(a,b,c-1)+w(a,b-1,c-1)-w(a,b-1,c);
    else
        return W[a][b][c]=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;
    memset(W,0,sizeof(W));
    while(~scanf("%d%d%d",&a,&b,&c)){
        if(a==-1&&b==-1&&c==-1) break;
        printf("w(%d, %d, %d) = %d\n",a,b,c,w(a,b,c));
    }
    return 0;
}

发布了85 篇原创文章 · 获赞 10 · 访问量 5251

猜你喜欢

转载自blog.csdn.net/riversuer/article/details/103429547