题目描述
虑如下的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<b且b<c,则w(a,b,c)=w(a,b,c-1)+ w(a,b-1,c-1)-w(a,b-1,c);
其它情况下: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)。
设计一个程序,快速计算w(a,b,c)并给出结果。
输入
为一行整数,包含3个数值,分别对应a、b和c的值。
输出
一个数,即w(a,b,c)的结果。
样例输入 复制
样例1
1 1 1
样例2
50 50 50
样例输出 复制
样例1
2
样例2
1048576
代码:
#include<bits/stdc++.h>
using namespace std;
int s[20][20][20];
int w(int a,int b,int c)
{
if(a<=0||b<=0||c<=0)
return 1;
if(a>20||b>20||c>20)
{
if(s[20][20][20]==0)s[20][20][20]=w(20,20,20);
return s[20][20][20];
}
if(a<b&&b<c)
{
if(s[a][b][c-1]==0)s[a][b][c-1]=w(a,b,c-1);
if(s[a][b-1][c-1]==0)s[a][b-1][c-1]=w(a,b-1,c-1);
if(s[a][b-1][c]==0)s[a][b-1][c]=w(a,b-1,c);
return s[a][b][c-1]+s[a][b-1][c-1]-s[a][b-1][c];
}
if(s[a-1][b][c]==0)s[a-1][b][c]=w(a-1,b,c);
if(s[a-1][b-1][c]==0)s[a-1][b-1][c]=w(a-1,b-1,c);
if(s[a-1][b][c-1]==0)s[a-1][b][c-1]=w(a-1,b,c-1);
if(s[a-1][b-1][c-1]==0)s[a-1][b-1][c-1]=w(a-1,b-1,c-1);
return s[a-1][b][c]+s[a-1][b-1][c]+s[a-1][b][c-1]-s[a-1][b-1][c-1];
}
int main()
{
int a,b,c;
cin>>a>>b>>c;
cout<<w(a,b,c);
}