对于一个递归函数 w ( a , b , c ) w(a,b,c) w(a,b,c)
这是个简单的递归函数,但实现起来可能会有些问题。当 a , b , c a,b,c a,b,c 均为 15 15 15 时,调用的次数将非常的多。你要想个办法才行。
注意:例如 w ( 30 , − 1 , 0 ) w(30,-1,0) w(30,−1,0) 又满足条件 1 1 1 又满足条件 2 2 2,请按照最上面的条件来算,答案为 1 1 1。
会有若干行。
并以 − 1 , − 1 , − 1 -1,-1,-1 −1,−1,−1 结束。
保证输入的数在 [ − 9223372036854775808 , 9223372036854775807 ] [-9223372036854775808,9223372036854775807] [−9223372036854775808,9223372036854775807] 之间,并且是整数。
输出若干行,每一行格式:
w(a, b, c) = ans
注意空格。
1 1 1
2 2 2
-1 -1 -1
w(1, 1, 1) = 2
w(2, 2, 2) = 4
这道题直接递归会超时,要用记忆化搜索。
ans数组记录之前计算的答案,b数组标记。
一定要先判断边界,再调用(数组下标不能为负)
#include
using namespace std;
int ans[25][25][25];
bool bo[25][25][25];
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(bo[a][b][c])//如果计算过,直接调用
return ans[a][b][c];
if(a<b&&b<c)
{
ans[a][b][c]=w(a,b,c-1)+w(a,b-1,c-1)-w(a,b-1,c);
bo[a][b][c]=1;//一定不要忘记标记
return ans[a][b][c];
}
ans[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);
bo[a][b][c]=1;
return ans[a][b][c];
}
int main()
{
int a,b,c;
while(scanf("%d%d%d",&a,&b,&c))
{
if(a==-1&&b==-1&&c==-1)
return 0;
printf("w(%d, %d, %d) = %d\n",a,b,c,w(a,b,c));//要写换行符,不然会WA
}
return 0;
}