1910 递归函数

1910 递归函数

链接:http://codevs.cn/problem/1910/

 

 时间限制: 1 s
 空间限制: 128000 KB
 
 
 
 
题目描述 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

题解:不能暴力,记忆化搜索

#include<bits/stdc++.h>
using namespace std;
int m[40][40][40];
int  w(int a,int b,int c){
     if(a<=0||b<=0||c<=0)return m[a][b][c]=1;
     if(m[a][b][c]) return m[a][b][c];
     if(a>20||b>20||c>20)return m[a][b][c]=w(20,20,20);
     if(a<b&&b<c)return m[a][b][c]=w(a, b, c - 1) + w(a, b - 1, c - 1) - w(a, b - 1, c);
     return m[a][b][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);
 }
int main(){
    int a,b,c;
    m[0][0][0]=1;
    for(int i=1;i<31;i++)
    for(int j=1;j<31;j++){
        m[i][j][0]=1;m[i][0][j]=1;m[0][i][j]=1;
    }
    while(cin>>a>>b>>c){
        
        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 printf("w(%d, %d, %d) = %d\n",a,b,c,w(a,b,c));
    }
}

 

posted @ 2017-08-28 19:29  Ed_Sheeran  阅读(283)  评论(0编辑  收藏  举报