题目描述
对于一个递归函数w(a,b,c)
如果a< =0 或者 b< =0 或者 c< =0就返回值1
如果a> 20 或者 b> 20 或者 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)
输入描述
会有若干行. 并以-1,-1,-1结束
输出描述
输出若干行
输入样例
1 1 1
2 2 2
-1 -1 -1
输出样例
w(1,1,1)=2
w(2,2,2)=4
这道题目就是一道经典的递归专题。
文中讲述了四个如果,那么我们可以用递归的函数来4个判断吗?其实不可以。
这道题目要用到记忆化的代码才能那满分哦!
思路:用一个bool类型的三维数组,在空间上创建一个桶
#include <bits/stdc++.h>
using namespace std;
int f[40][40][40];
bool vis[40][40][40];
int a,b,c;
int w(int a,int b,int c) {
if (a<=0 || b<=0 || c<=0)
return 1;
if (a>20 || b>20 || c>20)
return w(20,20,20);
if (!vis[a][b][c]) {
if (a<b && b<c) {
f[a][b][c]=w(a,b,c-1)+w(a,b-1,c-1)-w(a,b-1,c);
vis[a][b][c]=1;
}
else {
f[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);
vis[a][b][c]=1;
}
}
return f[a][b][c];
}
int main() {
while (1) {
scanf ("%d %d %d",&a,&b,&c);
if (a==-1 && b==-1 && c==-1)
return 0;
else
cout<<"w("<<a<<","<<b<<","<<c<<")="<<w(a,b,c)<<endl;
}
return 0;
}