POJ:1579 Function Run Fun(递归转换+打表)
2016-10-19 16:09
537 查看
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
题目大意:根据题目给的递归函数w(a,b,c),实现它,使时间变短。
解题思路:看到a、b、c中任意一个大于20,那么输出w(20,20,20),所以上界最多是20;再看每个状态方程都依赖于前一个状态,那么三重for循环打表即可。
代码如下:
#include <cstdio>
int dp[21][21][21];
void dabiao()
{
for(int i=0;i<21;i++)//打到20是因为一旦有一个超过20了,那么都是输出的dp[20][20][20]
{
for(int j=0;j<21;j++)
{
for(int k=0;k<21;k++)
{
if(i==0||j==0||k==0)//含0的都得是1 ,且下面的俩转移方程依赖于前一个i-1,j-1,k-1,所以一定要把这些情况写上去
{
dp[i][j][k]=1;
}
else
{
if(i<j&&j<k)//依赖于题目的方程
{
dp[i][j][k]=dp[i][j][k-1]+dp[i][j-1][k-1]-dp[i][j-1][k];
}
else////依赖于题目的方程
{
dp[i][j][k]=dp[i-1][j][k]+dp[i-1][j-1][k]+dp[i-1][j][k-1]-dp[i-1][j-1][k-1];
}
}
}
}
}
}
int main()
{
dabiao();
int a,b,c;
while(scanf("%d%d%d",&a,&b,&c)!=EOF)
{
if(a==-1&&b==-1&&c==-1)//结束标志
break;
if(a<=0||b<=0||c<=0)//一旦有一个小于0那么输出1
{
printf("w(%d, %d, %d) = 1\n",a,b,c);
}
else
{
if(a>20||b>20||c>20)//一旦有一个超过20了,那么都是输出的dp[20][20][20]
{
printf("w(%d, %d, %d) = %d\n",a,b,c,dp[20][20][20]);
}
else//输出那个数字
{
printf("w(%d, %d, %d) = %d\n",a,b,c,dp[a][b][c]);
}
}
}
return 0;
}
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 18326 | Accepted: 9365 |
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
题目大意:根据题目给的递归函数w(a,b,c),实现它,使时间变短。
解题思路:看到a、b、c中任意一个大于20,那么输出w(20,20,20),所以上界最多是20;再看每个状态方程都依赖于前一个状态,那么三重for循环打表即可。
代码如下:
#include <cstdio>
int dp[21][21][21];
void dabiao()
{
for(int i=0;i<21;i++)//打到20是因为一旦有一个超过20了,那么都是输出的dp[20][20][20]
{
for(int j=0;j<21;j++)
{
for(int k=0;k<21;k++)
{
if(i==0||j==0||k==0)//含0的都得是1 ,且下面的俩转移方程依赖于前一个i-1,j-1,k-1,所以一定要把这些情况写上去
{
dp[i][j][k]=1;
}
else
{
if(i<j&&j<k)//依赖于题目的方程
{
dp[i][j][k]=dp[i][j][k-1]+dp[i][j-1][k-1]-dp[i][j-1][k];
}
else////依赖于题目的方程
{
dp[i][j][k]=dp[i-1][j][k]+dp[i-1][j-1][k]+dp[i-1][j][k-1]-dp[i-1][j-1][k-1];
}
}
}
}
}
}
int main()
{
dabiao();
int a,b,c;
while(scanf("%d%d%d",&a,&b,&c)!=EOF)
{
if(a==-1&&b==-1&&c==-1)//结束标志
break;
if(a<=0||b<=0||c<=0)//一旦有一个小于0那么输出1
{
printf("w(%d, %d, %d) = 1\n",a,b,c);
}
else
{
if(a>20||b>20||c>20)//一旦有一个超过20了,那么都是输出的dp[20][20][20]
{
printf("w(%d, %d, %d) = %d\n",a,b,c,dp[20][20][20]);
}
else//输出那个数字
{
printf("w(%d, %d, %d) = %d\n",a,b,c,dp[a][b][c]);
}
}
}
return 0;
}
相关文章推荐
- POJ 1579 Function Run Fun 记忆化递归
- POJ - 1579:Function Run Fun(递归,记忆化搜索)
- 【poj1579】Function Run Fun (动态规划DP递归,记忆化递归)
- 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
- poj - 1579 Function Run Fun 【dp】
- POJ 1579-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
- poj1579——Function Run Fun