1910 递归函数(递归小练)

1910 递归函数

 

 时间限制: 1 s
 空间限制: 128000 KB
 题目等级 : 黄金 Gold
 
题目描述 Description

    对于一个递归函数w(a, b, c)。


  如果a <= 0 or b <= 0 or c <= 0就返回值1。

  如果a > 20 or b > 20 or c > 20就返回W(20,20,20)。

  如果a < b并且b < c 就返回w(a, b, c − 1) + w(a, b − 1, c − 1) − w(a, b − 1, c),

  其它别的情况就返回w(a − 1, b, c) + w(a − 1, b − 1, c) + w(a − 1, b, c − 1) − w(a −1, b - 1, c - 1)

  这是个简单的递归函数,但实现起来可能会有些问题。

输入描述 Input Description

    会有若干行.每行三个数,表示a, b, c。并以−1, −1, −1结束

输出描述 Output Description

    输出若干行,注意各种中的空格。

样例输入 Sample Input

1 1 1
2 2 2
-1 -1 -1

样例输出 Sample Output

w(1, 1, 1) = 2
w(2, 2, 2) = 4

数据范围及提示 Data Size & Hint

a, b, c < 30, Task < 11

分类标签 Tags 

 宝不开森!( ˇˍˇ )这么一个简单的递归+模拟,宝竟然因为函数内变量错误,wa了6

~~o(>_<)o ~~,简直不可原谅!!

不多说了,思路见题解!!

上菜!!!!!!╮(╯▽╰)╭

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int a,b,c,dp[101][101][101],ans;
int w(int aa,int bb,int cc)
{
    if(aa<=0||bb<=0||cc<=0)    return 1;
    if(dp[aa][bb][cc]!=999999999)
        return dp[aa][bb][cc];    
    else if(aa>20||bb>20||cc>20)
        ans=w(20,20,20);
    else if(aa<bb&&bb<cc)
        ans=w(aa,bb,cc-1)+w(aa,bb-1,cc-1)-w(aa,bb-1,cc);
    else    
        ans=w(aa-1,bb,cc)+w(aa-1,bb-1,cc)+w(aa-1,bb,cc-1)-w(aa-1,bb-1,cc-1);
    return dp[aa][bb][cc]=ans;
}
int main()
{
    for(int i=1;i<=100;i++)
        for(int j=1;j<=100;j++)
            for(int k=1;k<=100;k++)
                dp[i][j][k]=999999999;
    while(cin>>a>>b>>c&&a!=-1&&b!=-1&&c!=-1){
        cout<<"w"<<"("<<a<<", "<<b<<", "<<c<<")"<<" "<<"="<<" "<<w(a,b,c)<<endl;
        ans=0;
    }
    return 0;
}

 如果对你有所帮助,别忘了加好评哦;么么哒!!下次见!88

posted @ 2016-12-11 10:40  一蓑烟雨任生平  阅读(177)  评论(0)    收藏  举报