题目:来源于洛谷
absi2011 : 比如 w(30,-1,0)w(30,−1,0)既满足条件1又满足条件2
这种时候我们就按最上面的条件来算
所以答案为1
输入格式
会有若干行。
并以-1,-1,-1−1,−1,−1结束。
保证输入的数在[-9223372036854775808,9223372036854775807][−9223372036854775808,9223372036854775807]之间,并且是整数。
输出格式
输出若干行,每一行格式:
w(a, b, c) = ans
注意空格。
输入输出样例
输入 #1
1 1 1
2 2 2
-1 -1 -1
输出 #1
w(1, 1, 1) = 2
w(2, 2, 2) = 4
分析:
记忆化搜索,用一个数组记下函数的值
代码如下:
#include <iostream>
#include <cstdio>
using namespace std;
typedef long long LL;
//记忆初始化
LL a, b, c, note[30][30][30] = { 0 };
//需要改变参数的值,要加引用?
//加不了引用
LL w(LL a, LL b, LL c) {
//四种情况,话说他给的w(15, 15, 15)是怎么回事?
if (a <= 0 || b <= 0 || c <= 0) {
return 1;
}
else if (a > 20 || b > 20 || c > 20) {
//下面这句加引用报错了
//return w(20, 20, 20);
return w(20, 20, 20);
}
else if (a < b&&b < c) {
if (note[a][b][c-1] == 0) {
note[a][b][c - 1] = w(a, b, c - 1);
}
if (note[a][b-1][c - 1] == 0) {
note[a][b - 1][c - 1] = w(a, b - 1, c - 1);
}
if (note[a][b - 1][c] == 0) {
note[a][b - 1][c] = w(a, b - 1, c);
}
//这个错误是:原本是-,我却写成+
note[a][b][c] = note[a][b][c - 1] + note[a][b - 1][c - 1] - note[a][b - 1][c];
}
else {
if (note[a-1][b][c] == 0) {
note[a-1][b][c] = w(a-1, b, c);
}
if (note[a - 1][b-1][c] == 0) {
note[a - 1][b-1][c] = w(a - 1, b-1, c);
}
if (note[a - 1][b][c-1] == 0) {
note[a - 1][b][c - 1] = w(a - 1, b, c - 1);
}
if (note[a - 1][b-1][c - 1] == 0) {
note[a - 1][b-1][c - 1] = w(a - 1, b-1, c - 1);
}
//这个错误是:原本是-,我却写成+
note[a][b][c] = note[a - 1][b][c] + note[a - 1][b - 1][c] + note[a - 1][b][c - 1] - note[a - 1][b - 1][c - 1];
}
return note[a][b][c];
}
int main()
{
//仿照别人的代码
while (cin >> a >> b >> c) {
if (-1 == a && -1 == b && -1 == c) {
break;
}
printf("w(%lld, %lld, %lld) = %lld\n", a, b, c, w(a, b, c));
}
return 0;
}
(●ˇ∀ˇ●)