Function Run Fun(递归转递推)
2014-11-01 10:56
225 查看
Link:http://acm.hdu.edu.cn/showproblem.php?pid=1579
Problem:
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2223 Accepted Submission(s): 1170
Problem 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
冬练三九之一
Recommend
lcy | We have carefully selected several similar problems for you: 1730 1723 2285 1414 2602
#include<iostream>
#include<algorithm>
using namespace std;
int num[22][22][22];
int main()
{
int i,j,k,a,b,c;
for(i=0;i<21;i++)
{
for(j=0;j<21;j++)
{
for(k=0;k<21;k++)
{
if(!i||!j||!k)
num[i][j][k]=1;
else if(i<j&&j<k)
num[i][j][k]=num[i][j][k-1]+num[i][j-1][k-1]-num[i][j-1][k];
else
num[i][j][k]=num[i-1][j][k]+num[i-1][j-1][k]+num[i-1][j][k-1]-num[i-1][j-1][k-1];
}
}
}
while(scanf("%d%d%d",&a,&b,&c)==3)
{
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,num[20][20][20]);
else
printf("w(%d, %d, %d) = %d\n",a,b,c,num[a][b][c]);
}
return 0;
}
Problem:
Function Run Fun
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2223 Accepted Submission(s): 1170
Problem 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
冬练三九之一
Recommend
lcy | We have carefully selected several similar problems for you: 1730 1723 2285 1414 2602
#include<iostream>
#include<algorithm>
using namespace std;
int num[22][22][22];
int main()
{
int i,j,k,a,b,c;
for(i=0;i<21;i++)
{
for(j=0;j<21;j++)
{
for(k=0;k<21;k++)
{
if(!i||!j||!k)
num[i][j][k]=1;
else if(i<j&&j<k)
num[i][j][k]=num[i][j][k-1]+num[i][j-1][k-1]-num[i][j-1][k];
else
num[i][j][k]=num[i-1][j][k]+num[i-1][j-1][k]+num[i-1][j][k-1]-num[i-1][j-1][k-1];
}
}
}
while(scanf("%d%d%d",&a,&b,&c)==3)
{
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,num[20][20][20]);
else
printf("w(%d, %d, %d) = %d\n",a,b,c,num[a][b][c]);
}
return 0;
}
相关文章推荐
- Function Run Fun--CSU-ACM2017暑期训练3-递推与递归
- [递归理解/记忆化] HDU/HOJ 1331 Function Run Fun
- POJ1579——Function Run Fun(记忆化递归)
- HDU 1579 Function Run Fun
- Function Run Fun
- zstu 1036 Function Run Fun
- Pku 1579 Function Run Fun
- POJ 1597 Function Run Fun
- poj-1579 Function Run Fun
- zoj 1168 || poj 1579 Function Run Fun
- poj 1579 Function Run Fun
- poj Function Run Fun(DP)(记忆化搜索)
- poj 1579 Function Run Fun
- POJ 1579 Function Run Fun
- poj Function Run Fun(DP)(记忆化搜索)
- poj 1579 Function Run Fun
- Function Run Fun
- POJ 1579 Function Run Fun
- Function Run Fun(ZJU_1168)
- poj1579 Function Run Fun