题目描述
对于一个递归函数w(a,b,c)
如果a≤0a \le 0a≤0 or b≤0b \le 0b≤0 or c≤0c \le 0c≤0就返回值111.
如果a>20a>20a>20 or b>20b>20b>20 or c>20c>20c>20就返回w(20,20,20)w(20,20,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,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均为15时,调用的次数将非常的多。你要想个办法才行. 比如 w(30,−1,0)既满足条件1又满足条件2这种时候我们就按最上面的条件来算所以答案为1
输入输出格式
输入格式:
会有若干行。并以−1,−1,−1结束。
输出格式:
输出若干行,每一行格式:w(a, b, c) = ans注意空格。
#include<iostream>
#include<cstdio>
#include<string.h>
typedef long long ll;
using namespace std;
ll f[25][25][25];
ll w(ll a, ll b, ll c) {
if (a <= 0 || b <= 0 || c <= 0) {
return 1;
}
else if (f[a][b][c] != 0)return f[a][b][c];
else if (a > 20 || b > 20 || c > 20) {
f[a][b][c] = w(20, 20, 20);
}
else if (a < b&&b < c)f[a][b][c] = w(a, b, (c - 1)) + w(a, (b - 1), (c - 1)) - w(a, (b - 1), c);
else 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);
return f[a][b][c];
}
int main() {
ll a, b, c;
while(cin >> a >> b >> c){
memset(f, 0, sizeof(f));
if (a == -1 && b == -1 && c == -1) {
break;
}
printf("w(%lld, %lld, %lld) = ", a, b, c);
if (a > 20) a = 21;
if (b > 20) b = 21;
if (c > 20) c = 21;
printf("%lld\n", w(a, b, c));
}
return 0;
}