标签:
POJ - 1579
Description
We all love recursion! Don‘t we?
Consider a three-parameter recursive function w(a, b, c): if a <= 0 or b <= 0 or c <= 0, then w(a, b, c) returns: 1 if a > 20 or b > 20 or c > 20, then w(a, b, c) returns: w(20, 20, 20) if a < b and b < c, then w(a, b, c) returns: w(a, b, c-1) + w(a, b-1, c-1) - w(a, b-1, c) otherwise it returns: w(a-1, b, c) + w(a-1, b-1, c) + w(a-1, b, c-1) - w(a-1, b-1, c-1) This is an easy function to implement. 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. Input
The input for your program will be a series of integer triples, one per line, until the end-of-file flag of -1 -1 -1. Using the above technique, you are to calculate w(a, b, c) efficiently and print the result.
Output
Print the value for w(a,b,c) for each triple.
Sample Input 1 1 1 2 2 2 10 4 6 50 50 50 -1 7 18 -1 -1 -1 Sample Output w(1, 1, 1) = 2 w(2, 2, 2) = 4 w(10, 4, 6) = 523 w(50, 50, 50) = 1048576 w(-1, 7, 18) = 1//这是非常简单的记忆化搜索入门题 /* Source Code Problem: 1579 User: 2486 Memory: 432K Time: 0MS Language: G++ Result: Accepted */ #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn=20+5; int dp[maxn][maxn][maxn]; int a,b,c; int dfs(int x,int y,int z){ if(x<=0||y<=0||z<=0)return 1; else if(x<=20&&y<=20&&z<=20&&dp[x][y][z]!=-1)return dp[x][y][z]; else if(x>20||y>20||z>20)return dfs(20,20,20); else if(x<y&&y<z)return dp[x][y][z]=dfs(x,y,z-1)+dfs(x,y-1,z-1)-dfs(x,y-1,z); else return dp[x][y][z]=dfs(x-1,y,z)+dfs(x-1,y-1,z)+dfs(x-1,y,z-1)-dfs(x-1,y-1,z-1); } int main() { memset(dp,-1,sizeof(dp)); while(~scanf("%d%d%d",&a,&b,&c),a!=-1||b!=-1||c!=-1){ printf("w(%d, %d, %d) = %d\n",a,b,c,dfs(a,b,c)); } return 0; } |
标签:
原文地址:http://blog.csdn.net/qq_18661257/article/details/46572369