对于一个递归函数 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 结束。
输出若干行,每一行格式:
w(a, b, c) = ans
注意空格。
1 1 1
2 2 2
-1 -1 -1
w(1, 1, 1) = 2
w(2, 2, 2) = 4
保证输入的数在 [ − 9223372036854775808 , 9223372036854775807 ] [-9223372036854775808,9223372036854775807] [−9223372036854775808,9223372036854775807] 之间,并且是整数。
保证不包括 − 1 , − 1 , − 1 -1, -1, -1 −1,−1,−1 的输入行数 T T T 满足 1 ≤ T ≤ 1 0 5 1 \leq T \leq 10 ^ 5 1≤T≤105。
#include
#define MAX 21
long long w(long long a, long long b, long long c); // 定义函数来计算w(a, b, c)的值
long long dp[MAX][MAX][MAX]; // 定义一个三维数组dp来存储已经计算过的w(a, b, c)的值
int main()
{
long long a, b, c;
while (scanf("%lld %lld %lld", &a, &b, &c) != EOF)
{
if (a == -1 && b == -1 && c == -1)
{
break;
}
printf("w(%lld, %lld, %lld) = %lld\n", a, b, c, w(a, b, c));
}
return 0;
}
long long w(long long a, long long b, long long c) // 定义函数来计算w(a, b, c)的值
{
if (a <= 0 || b <= 0 || c <= 0)
{
return 1;
}
else if (a > 20 || b > 20 || c > 20)
{
return w(20, 20, 20);
}
else if (dp[a][b][c] != 0) // 如果已经计算过w(a, b, c),那么直接返回对应的值
{
return dp[a][b][c];
}
if (a < b && b < c)
{
dp[a][b][c] = w(a, b, c - 1) + w(a, b - 1, c - 1) - w(a, b - 1, c);
}
else
{
dp[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);
}
return dp[a][b][c];
}