P1464. Function

考点

  • 线性动态规划

题解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

const int LEN = 25;

ll mem[LEN][LEN][LEN];

ll w(ll a, ll b, ll 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 (mem[a][b][c])
return mem[a][b][c];
else if (a < b && b < c)
return mem[a][b][c] = w(a, b, c - 1) + w(a, b - 1, c - 1) - w(a, b - 1, c);
else
return mem[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()
{
ll a, b, c;
while ((cin >> a >> b >> c) && (a != -1 || b != -1 || c != -1))
{
printf("w(%lld, %lld, %lld) = %lld\n", a, b, c, w(a, b, c));
}
}

思路

没有坑点,按照题意分配好记忆化搜索的语句即可