POJ 1579 记忆化递归

来源:互联网 发布:淘宝开店人脸认证失败 编辑:程序博客网 时间:2024/05/22 06:25

大概题意就是一个简单递归,但Description最后一行中:

The problem is, if implemented directly, for moderate values of a, b and c (for example, a = 15, b = 15, c = 15), the program takes hours to run because of the massive recursion.

所以一开始以为是要把DP过程优化,求教后获悉记忆化递归,其实是一个很简单的操作:把之前的每一个小问题的结果保存下来以方便下次直接调用,但在递归的过程中却可以节省大量的时间与资源。


Code:

#include <stdio.h>#include <string.h>int w[25][25][25];int f(int a,int b,int c){    if(a<=0||b<=0||c<=0) return 1;    if(a>20||b>20||c>20) return w[20][20][20]=f(20,20,20);    if(w[a][b][c]!=0) return w[a][b][c];    if(a<b&&b<c) return w[a][b][c]=f(a,b,c-1)+f(a,b-1,c-1)-f(a,b-1,c);    return w[a][b][c]=f(a-1,b,c)+f(a-1,b-1,c)+f(a-1,b,c-1)-f(a-1,b-1,c-1);}int main(){    int a,b,c;    while(scanf("%d%d%d",&a,&b,&c)&&(a!=-1||b!=-1||c!=-1))    {        memset(w,0,sizeof(w));        printf("w(%d, %d, %d) = %d\n",a,b,c,f(a,b,c));    }    return 0;}


原创粉丝点击