源码(C++ 14 (GCC 9)):
#include <cstdio>
long long int memory[25][25][25];
long long int w(long long int a, long long int b, long long int c);
int main(void)
{
long long int a, b, c;
while (a != -1 && b != -1 && c != -1)
{
scanf("%lld %lld %lld", &a, &b, &c);
if (a == -1 && b == -1 && c == -1)
{
break;
}
printf("w(%lld, %lld, %lld) = %lld", a, b, c, w(a, b, c));
}
return 0;
}
long long int w(long long int a, long long int b, long long c)
{
if (memory[a][b][c] != 0)
{
return memory[a][b][c];
}
else if (a <= 0 || b <= 0 || c <= 0)
{
return 1;
}
else if (a > 20 || b > 20 || c > 20)
{
memory[a][b][c] = w(20, 20, 20);
return memory[a][b][c];
}
else if (a < b && b < c)
{
if (memory[a][b][c - 1] == 0)
{
memory[a][b][c - 1] = w(a, b, c - 1);
}
if (memory[a][b - 1][c - 1] == 0)
{
memory[a][b - 1][c - 1] = w(a, b - 1, c - 1);
}
if (memory[a][b - 1][c] == 0)
{
memory[a][b - 1][c] = w(a, b - 1, c);
}
memory[a][b][c] = memory[a][b][c - 1] + memory[a][b - 1][c - 1] - memory[a][b - 1][c];
return memory[a][b][c];
}
else
{
if (memory[a - 1][b][c] == 0)
{
memory[a - 1][b][c] = w(a - 1, b, c);
}
if (memory[a - 1][b - 1][c] == 0)
{
memory[a - 1][b - 1][c] = w(a - 1, b - 1, c);
}
if (memory[a - 1][b][c - 1] == 0)
{
memory[a - 1][b][c - 1] = w(a - 1, b, c - 1);
}
if (memory[a - 1][b - 1][c - 1] == 0)
{
memory[a - 1][b - 1][c - 1] = w(a - 1, b - 1, c - 1);
}
memory[a][b][c] = memory[a - 1][b][c] + memory[a - 1][b - 1][c] + memory[a - 1][b][c - 1] - memory[a - 1][b - 1][c - 1];
return memory[a][b][c];
}
}
我用了记忆化搜索,结果 RE,本地样例可过。