目录
题目描述
输入描述
输出描述
解析
完整代码
描述
考虑如下的3参数递归函数w(a,b,c);
如果a≤0或b≤0或c≤0,则w(a,b,c)=1;
如果a>20或b>20或c>20,则w(a,b,c)=w(20,20,20);
如果a其他情况下:w(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)。
输入描述
1行整数,包含3个数值,分别对应a、b和c的值。
输出描述
一个数,即w(a,b,c)的结果。
用例输入 1
1 1 1
用例输出 1
2
这题是最基础的递归,一定要会;把题目上说的每一种情况一一列举出来,返回相应的值(三维数组)就行了;
下面出示代码:
#include<bits/stdc++.h>
using namespace std;
long long a,b,c,p[65][65][65];
long long w(long long x,long long y,long long z){
if(x<=0 || y<=0 || z<=0){
return 1;
}
else if(x>20 || y>20 || z>20){
return w(20,20,20);
}
else if(p[x][y][z]!=0){
return p[x][y][z];
}
else if(x<y && y<z){
p[x][y][z]=w(x,y,z-1)+w(x,y-1,z-1)-w(x,y-1,z);
return p[x][y][z];
}
else{
p[x][y][z]=w(x-1,y,z)+w(x-1,y-1,z)+w(x-1,y,z-1)-w(x-1,y-1,z-1);
return p[x][y][z];
}
}
int main(){
while(cin>>a>>b>>c){
if(a==-1&&b==-1&&c==-1)return 0;
long long n=w(a,b,c);
printf("%lld\n",n);
}
return 0;
}