POJ 1579 Function Run Fun 记忆化搜索
2015-10-31 13:06
441 查看
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
[Submit] [Go
Back] [Status] [Discuss]
ACcode:
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 17499 | Accepted: 8963 |
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
[Submit] [Go
Back] [Status] [Discuss]
ACcode:
#pragma warning(disable:4786)//使命名长度不受限制
#pragma comment(linker, "/STACK:102400000,102400000")//手工开栈
#include <map>
#include <set>
#include <queue>
#include <cmath>
#include <stack>
#include <cctype>
#include <cstdio>
#include <cstring>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
#define rd(x) scanf("%d",&x)
#define rd2(x,y) scanf("%d%d",&x,&y)
#define rds(x) scanf("%s",x)
#define rdc(x) scanf("%c",&x)
#define ll long long int
#define maxn 100005
#define mod 1000000007
#define INF 0x3f3f3f3f //int 最大值
#define FOR(i,f_start,f_end) for(int i=f_start;i<=f_end;++i)
#define MT(x,i) memset(x,i,sizeof(x))
#define PI acos(-1.0)
#define E exp(1)
using namespace std;
int a,b,c;
int cnt=1;
int dp[30][30][30];
int fun(int a,int b,int c){
if(a<=0||b<=0||c<=0)return 1;
if(a>20||b>20||c>20)
return dp[20][20][20]=fun(20,20,20);
if(dp[a][b][c])return dp[a][b][c];
if(a<b&&b<c)
return dp[a][b][c]=fun(a,b,c-1)+fun(a,b-1,c-1)-fun(a,b-1,c);
return dp[a][b][c]=fun(a-1,b,c)+fun(a-1,b-1,c)+fun(a-1,b,c-1)-fun(a-1,b-1,c-1);
}
int main(){
while(scanf("%d %d %d",&a,&b,&c)!=EOF){
if(a==-1&&b==-1&&c==-1)break; MT(dp,0);
printf("w(%d, %d, %d) = %d\n",a,b,c,fun(a,b,c));
}
return 0;
}
/*
1 1 1 2 2 2 10 4 6 50 50 50 -1 7 18 -1 -1 -1
*/
相关文章推荐
- Android的webview加载本地html、本apk内html和远程URL
- Java中如何删除用hashtable创建的树节点
- 网络编程
- leetcode Next Permutation
- 网盘禁传盗版:对用户内容进行全方位监测
- 基于Exynos4412 cortex A9开发板的无线网卡驱动移植过程
- 设计模式 --> (3)策略模式
- ubuntu文件系统结构讲解
- Mysql+Dos总结
- linux
- 文章标题
- videojs设置播放点
- Linux系统管理命令之用户组管理
- 编译错误need 'typename' before *** because *** is a dependent scope 浅析
- SpringMVC中 Redirect后地址栏带参数, 怎么把它去掉.
- Linux内核协议栈-从BSD socket接口层到传输层1
- 指尖上的数据库之探囊取物
- java紧耦合与松耦合关系
- ubuntu中怎样添加或删除一个PPA源
- 2015第44周六tomcat集群了解