Function Run Fun POJ
来源:互联网 发布:vod网络媒体播放器 编辑:程序博客网 时间:2024/06/13 03:19
传送门
题目:
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.
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 12 2 210 4 650 50 50-1 7 18-1 -1 -1
Sample Output
w(1, 1, 1) = 2w(2, 2, 2) = 4w(10, 4, 6) = 523w(50, 50, 50) = 1048576w(-1, 7, 18) = 1
大致题意:给了递归式,让你剪枝。
解法:用一个三位数组将走过的状态保存起来,记忆化搜索。
代码1:32ms过
#include<stdio.h>#include<string>#include<string.h>#include<algorithm>#include<iostream>#include<math.h>using namespace std;const int maxn = 100;int a, b, c, dp[maxn][maxn][maxn];int dfs(int x, int y, int z){ if(x <= 0 || y <= 0 || z <= 0) return 1; if(x > 20 || y > 20 || z > 20) return dfs(20, 20, 20); if(dp[x][y][z])//如果已经搜过,直接返回这个状态。注意这个判断条件不能放在上面,因为可能会数组越界。 return dp[x][y][z]; if(x < y && y < z) { dp[x][y][z] = dfs(x, y, z-1) + dfs(x, y-1, z-1) - dfs(x, y-1, z); return dp[x][y][z]; } else { dp[x][y][z] = dfs(x-1, y, z) + dfs(x-1, y-1, z) + dfs(x-1, y, z-1) - dfs(x-1, y-1, z-1); return dp[x][y][z]; }}int main(){ while(scanf("%d%d%d",&a,&b,&c) != EOF) { if(a == -1 && b == -1 && c == -1) break; memset(dp, 0, sizeof(dp)); int ans = dfs(a, b, c); printf("w(%d, %d, %d) = %d\n", a, b, c, ans); } return 0;}
代码2:参考了大神的代码,先打表,0ms过。
#include<stdio.h>#include<algorithm>#include<string>#include<string.h>#include<iostream>#include<math.h>using namespace std;const int maxn = 25;int dp[maxn][maxn][maxn];int main(){ for(int i = 0; i < 21; i ++) for(int j = 0; j < 21; j ++) for(int k = 0; k < 21; k ++) { dp[i][j][0] = 1; dp[i][0][k] = 1; dp[0][j][k] = 1; } for(int i = 1; i < 21; i ++) for(int j = 1; j < 21; j ++) for(int k = 1; k < 21; k ++) { 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 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) 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, dp[20][20][20]); else printf("w(%d, %d, %d) = %d\n",a, b, c, dp[a][b][c]); } return 0;}
如有错误,欢迎指出~
阅读全文
1 0
- POJ Function Run Fun
- Function Run Fun POJ
- 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
- 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
- POJ-1579-Function Run Fun
- poj-1579-Function Run Fun
- elasticsearch spring 整合
- 使用Android Studio进行UI测试与Record Espresso Test自动生成测试代码
- 如何让Asp.net TextBox控件只允许输入数字
- 【OpenGL】绘制一个点
- Simulink数据保存提取和示波器显示
- Function Run Fun POJ
- 点击打印按钮,开始渲染iframe然后执行打印事件
- 使用eclipse建立webservice服务和客户端
- 绝对强大的三个linux指令: ar, nm, objdump
- docker详解
- 读入优化
- JavaWeb(2)_myEclipse_端口被占用
- C Primer Plus 第五章
- hdu 6129-推理