poj 1579 Function Run Fun
2012-07-30 10:43
405 查看
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.
题意很好理解,不解释
数组还函数的名字不要起一样的,要大小写区分
分析,由于子问题过多,每次递归的时候就记录结果
从别人那学来的
预处理
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.
题意很好理解,不解释
数组还函数的名字不要起一样的,要大小写区分
分析,由于子问题过多,每次递归的时候就记录结果
#include<stdio.h> #include<string.h> const int MAXN=25; int w[MAXN][MAXN][MAXN]; int W(int a,int b,int c) { if(w[a][b][c]) return w[a][b][c]; if(a<=0 || b<=0 || c<=0) return w[a][b][c]=1; 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; while(scanf("%d%d%d",&a,&b,&c)) { memset(w,0,sizeof(w)); if(a==-1 && b==-1 && c==-1) break; if(a<=0 || b<=0 || c<=0) printf("w(%d, %d, %d) = 1\n",a,b,c); else if(a>20 || b>20 || c>20) printf("w(%d, %d, %d) = %d\n",a,b,c,W(20,20,20)); else printf("w(%d, %d, %d) = %d\n",a,b,c,W(a,b,c)); } return 0; }
从别人那学来的
预处理
void init() { for(a=0;a<=20;a++) for(b=0;b<=20;b++) for(c=0;c<=20;c++) m[a][b][c]=1; for(a=1;a<=20;a++) for(b=1;b<=20;b++) for(c=1;c<=20;c++){ if(a < b && b < c) m[a][b][c]=m[a][b][c-1]+m[a][b-1][c-1]-m[a][b-1][c]; else m[a][b][c]=m[a-1][b][c]+m[a-1][b-1][c]+m[a-1][b][c-1]-m[a-1][b-1][c-1]; } }
相关文章推荐
- poj 1579 function run fun
- Function Run Fun--POJ 1579
- [POJ] 1579 -> Function Run Fun
- poj 1579 Function Run Fun
- POJ1579:Function Run Fun
- POJ 1579 Function Run Fun——记忆化搜索
- poj 1579 Function Run Fun
- Function Run Fun poj1579
- 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
- zoj 1168 || poj 1579 Function Run Fun
- poj1579 Function Run Fun
- Poj 1579 Function Run Fun
- POJ 1579 Function Run Fun
- poj 1579 Function Run Fun
- POJ1579 HDOJ1579 Function Run Fun