问题描述
对于一个递归函数
- 如果 或 或 就返回值$ 1$。
- 如果 或 或 就返回
- 如果 并且 就返回$ w(a,b,c-1)+w(a,b-1,c-1)-w(a,b-1,c)$。
- 其它的情况就返回
这是个简单的递归函数,但实现起来可能会有些问题。当 均为 时,调用的次数将非常的多。你要想个办法才行。
注意:例如 又满足条件 又满足条件 ,请按照最上面的条件来算,答案为 。
输入格式
会有若干行。
并以 结束。
保证输入的数在 之间,并且是整数。
输出格式
输出若干行,每一行格式:
w(a, b, c) = ans
注意空格。
样例
输入
1 1 1
2 2 2
-1 -1 -1
输出
w(1, 1, 1) = 2
w(2, 2, 2) = 4
解决方案
思路
记忆化搜索
代码
#include <iostream>
using namespace std;
long long f[21][21][21];
long long w(long long a, long long b, long long c) {
if (a <= 0 || b <= 0 || c <= 0)
return 1;
if (a > 20 || b > 20 || c > 20)
return w(20, 20, 20);
if (f[a][b][c])
return f[a][b][c];
if (a < b && b < c)
return f[a][b][c] = w(a, b, c - 1) + w(a, b - 1, c - 1) - w(a, b - 1, c);
return f[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);
}
int main() {
while (true) {
long long a, b, c;
scanf("%lld%lld%lld", &a, &b, &c);
if (a == -1 && b == -1 && c == -1)
break;
printf("w(%lld, %lld, %lld) = %lld\n",a,b,c,w(a,b,c));
}
return 0;
}