桐桐的递归函数
题目大意:
有一个函数,让你照着打
原题:
题目描述
桐桐经常找一些很有趣的数学书来阅读以增长自己的数学知识。一天,他偶然发现一个递归函数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)。
请编程求出这个递归函数的值。
输入
a,b,c三个整数。(-50≤a,b,c≤50)
输出
a,b,c三个整数所对应的w(a,b,c)函数的值。要求以w(a,b,c)=函数的值来输出。
输入样例
1 1 1
输出样例
w(1,1,1)=2
解题思路:
直接照着打,再加个记忆化搜索就行了
代码:
#include<cstdio>
using namespace std;
int aa,bb,cc,s[150][150][150];
int w(int a,int b,int c)
{if (s[a+50][b+50][c+50]) return s[a+50][b+50][c+50];//记忆化,+50是因为不能存负数else if (a<=0||b<=0||c<=0) s[a+50][b+50][c+50]=1;//详情见题目else if(a>20||b>20||c>20) s[a+50][b+50][c+50]=w(20,20,20);else if(a<b&&b<c) s[a+50][b+50][c+50]=w(a,b,c-1)+w(a,b-1,c-1)-w(a,b-1,c);else s[a+50][b+50][c+50]=w(a-1,b,c)+w(a-1,b-1,c)+w(a-1,b,c-1)-w(a-1,b-1,c-1);return s[a+50][b+50][c+50];
}
int main()
{scanf("%d %d %d",&aa,&bb,&cc);printf("w(%d,%d,%d)=%d",aa,bb,cc,w(aa,bb,cc));//输出
}