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 ",a,b,c); else printf("w(%d, %d, %d) = %d ",a,b,c,w(a,b,c)); } }