递归的函数
来源:互联网 发布:淘宝卖家盗用我的图片 编辑:程序博客网 时间:2024/06/07 22:02
Problem Description
给定一个函数 f(a, b, c):
如果 a ≤ 0 或 b ≤ 0 或 c ≤ 0 返回值为 1;
如果 a > 20 或 b > 20 或 c > 20 返回值为 f(20, 20, 20);
如果 a < b 并且 b < c 返回 f(a, b, c−1) + f(a, b−1, c−1) − f(a, b−1, c);
其它情况返回 f(a−1, b, c) + f(a−1, b−1, c) + f(a−1, b, c−1) − f(a-1, b-1, c-1)。
看起来简单的一个函数?你能做对吗?
Input
输入包含多组测试数据,对于每组测试数据:
输入只有一行为 3 个整数a, b, c(a, b, c < 30)。
Output
对于每组测试数据,输出函数的计算结果。
Example Input
1 1 12 2 2
Example Output
24
Hint
递归是一个非常耗时的操作,递归思想简单,其实是将繁重的任务交给计算机来完成。计算机来记住某个时候的状态,转身去处理新的问题,也就是利用堆栈的原理。频繁的压栈和出栈将耗费大量的计算机资源。例如著名的汉诺塔。在某些递归模型中例如1579,递归过程中可能蕴含之前已经解决过的问题,所以我们完全可以没处理一个新的小问题时,就把这个小问题的结果保存下来。以备后用。这就是记忆化递归!非常节省效率!
-------转自http://blog.csdn.net/li4951/article/details/6816784
#include<stdio.h>#include<string.h>int f[40][40][40];int ji(int a,int b,int c){ if(a<=0||b<=0||c<=0) return 1; if(f[a][b][c]>0) return f[a][b][c]; else if(a>20||b>20||c>20) return f[a][b][c]=ji(20,20,20); else if(a<b&&b<c) return f[a][b][c]=ji(a,b,c-1)+ji(a,b-1,c-1)-ji(a,b-1,c); else return f[a][b][c]=ji(a-1,b,c)+ji(a-1,b-1,c)+ji(a-1,b,c-1)-ji(a-1,b-1,c-1);};int main(){ int a,b,c; for(int i=1;i<=39;i++) { for(int j=1;j<=39;j++) { for(int k=1;k<=39;k++) { f[i][j][k]=0; } } } while(scanf("%d%d%d",&a,&b,&c)!=EOF) { printf("%d\n",ji(a,b,c)); } return 0;}
0 0
- 递归函数的理解
- 递归函数的学习
- 函数的递归调用
- 函数的递归
- 递归函数的原理
- 递归函数的应用
- 递归函数的应用
- 递归函数的应用
- 函数的递归
- 函数的递归调用
- 函数的递归好比...
- 递归的函数
- 递归的函数
- C + +的递归函数
- 递归的函数
- 函数的递归
- 递归函数的认识
- 函数递归的优缺点
- yii2模型之增删改查
- codeblocks换编译器
- OpenCv矩阵元素的访问技巧
- JavaScript公共验证函数
- STL容器知识总结 [转载]
- 递归的函数
- n&=(n-1)的应用
- yii2框架中表单提交出现Bad Request (#400)---Unable to verify your data submission的错误解决方
- 常用挂载命令
- Leetcode88. Merge Sorted Array
- 算m点问题(dfs+排列树)
- C++大随机数的问题
- python操作json对象
- 精选的颜色