递归的函数

来源:互联网 发布:淘宝卖家盗用我的图片 编辑:程序博客网 时间: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
原创粉丝点击