Function Run Fun
2016-07-20 14:48
162 查看
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
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
#include <iostream> using namespace std; long long w(int a,int b,int c); int main() { int a,b,c; while(cin>>a>>b>>c&&(a!=-1||b!=-1||c!=-1)){ cout<<"w("<<a<<", "<<b<<", "<<c<<") = "<<w(a,b,c)<<endl; } return 0; } long long w(int a,int b,int c){ if(a<=0||b<=0||c<=0) return 1; long long dp[25][25][25]; int i,j,k; for(i=0;i<=20;i++){ for(j=0;j<=20;j++) for(k=0;k<=20;k++){ dp[i][j][k]=1; } } for(i=1;i<=20;i++){ for(j=1;j<=20;j++){ for(k=1;k<=20;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]; } } } /* for(i=0;i<=20;i++){ for(j=0;j<=20;j++){ for(k=0;k<=20;k++){ cout<<dp[i][j][k]<<" "; } cout<<endl; } }*/ if(a>20||b>20||c>20) return dp[20][20][20]; return dp[a][b][c]; }
相关文章推荐
- Linux下Redis主从复制(master-slave)配置
- Eclipse打包带mysql的java程序
- 今天
- MySQL 获得当前日期时间 函数
- 暑假训练赛20160720
- httpwebrequest 服务器提交了协议冲突. section=responsestatusline
- Struts2 学习笔记
- canvas arcTo()用法详解
- 用libmp4v2录制h264和aac rtp流为mp4文件
- Codeforces Round #363 (Div. 2)A Launch of Collider
- Html之 textarea 控件
- linux下利用fork()函数创建进程
- Android:interpolator用法
- vim基础命令
- 对字符串提取以及运算操作处理
- MySQL 索引 总结
- 【Unity3d】碰撞检测
- openwrt 上cron的使用
- 李航《统计学习方法》第四章——用Python实现朴素贝叶斯分类器(MNIST数据集)
- Android开源:数据库ORM框架GreenDao学习(二)数据库查询篇