POJ-1579 Function Run Fun
2012-11-20 17:11
429 查看
Function Run Fun
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
Sample Output
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 13517 | Accepted: 7040 |
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
#include <iostream> #include <cstdio> #include <cstring> using namespace std; int dp[21][21][21]; int calw(int a, int b, int c) { if(a <= 0 || b <= 0 || c <= 0) { //[a][b][c] = 1; //注意这里不能直接写,以为a、b、c可能超出数组范围 return 1; } if(a > 20 || b > 20 || c > 20) { dp[20][20][20] = calw(20, 20, 20); return dp[20][20][20]; } if(dp[a][b][c]) return dp[a][b][c]; if(a < b && b < c) { dp[a][b][c] = calw(a, b, c - 1) + calw(a, b - 1, c - 1) - calw(a, b-1, c); return dp[a][b][c]; } dp[a][b][c] = calw(a-1, b, c) + calw(a - 1, b - 1, c) + calw(a - 1, b, c - 1) - calw(a - 1, b - 1, c - 1); return dp[a][b][c]; } int main() { int a, b, c; while(cin >> a >> b >> c && a != -1 || b != -1 || c != -1) { printf("w(%d, %d, %d) = %d\n",a, b, c, calw(a, b, c)); } return 0; }
相关文章推荐
- poj1579 Function Run Fun
- poj 1579 Function Run Fun
- POJ1579 HDOJ1579 Function Run Fun
- POJ 1579 Function Run Fun
- poj 1579 Function Run Fun
- POJ 1579 Function Run Fun
- Function Run Fun POJ - 1579 记忆化搜索
- poj 1579 Function Run Fun
- POJ1579——Function Run Fun(记忆化递归)
- POJ1579 Function Run Fun
- POJ 1579 Function Run Fun
- poj 1579 Function Run Fun
- poj1579 Function Run Fun
- POJ-1579-Function Run Fun
- POJ_1579_Function Run Fun
- poj 1579 Function Run Fun
- POJ 1579 Function Run Fun
- POJ 1579 Function Run Fun
- POJ 1579 Function Run Fun
- poj 1579 Function Run Fun