POJ 1579 Function Run Fun
2017-07-27 14:17
405 查看
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
Source
Pacific Northwest 1999
题目比较简单,但是虽然题目给了你递归的表达式,但是我们不能直接使用,不然的话,肯定超时,
我的做法相对简单,直接,用for循环打表,O(n^3)。但是比较坑的地方在于,要完全按照他递归的写法来循环
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 19515 | Accepted: 9866 |
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
Pacific Northwest 1999
题目比较简单,但是虽然题目给了你递归的表达式,但是我们不能直接使用,不然的话,肯定超时,
我的做法相对简单,直接,用for循环打表,O(n^3)。但是比较坑的地方在于,要完全按照他递归的写法来循环
#include<cstdio> #include<algorithm> #include<set> #include<iostream> #include<cmath> #include<cstring> using namespace std; int f[25][25][25]; int main () { int a,b,c; memset(f,0,sizeof(0)); for(int i=0; i<21; i++) for(int j=0; j<21; j++) for (int k=0; k<21; k++) { if(!i||!j||!k) f[i][j][k]=1; else if(i<j&&j<k) f[i][j][k]=f[i][j][k-1]+f[i][j-1][k-1]-f[i][j-1][k]; else f[i][j][k]=f[i-1][j][k]+f[i-1][j-1][k]+f[i-1][j][k-1]-f[i-1][j-1][k-1]; } while(~scanf("%d%d%d",&a,&b,&c)) { if(a==-1&&b==-1&&c==-1) break; int d=a,e=b,h=c; if(a<=0||b<=0||c<=0) a=0,b=0,c=0;//这里的条件判断不能写反,题目是先判断是否小于0再判断是否大于20的 else if(a>20||b>20||c>20) a=20,b=20,c=20; printf("w(%d, %d, %d) = %d\n",d,e,h,f[a][b][c]); } }
相关文章推荐
- 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
- POJ1579:Function Run Fun
- poj 1579 Function Run Fun
- POJ1579 Function Run Fun
- poj 1579 Function Run Fun
- POJ- 1579 Function Run Fun
- zoj 1168 || poj 1579 Function Run Fun
- Function Run Fun poj1579
- POJ 1579 Function Run Fun
- poj-1579 Function Run Fun
- POJ-1579 Function Run Fun
- POJ1579 HDOJ1579 Function Run Fun
- poj 1579 Function Run Fun
- POJ 1579 Function Run Fun