题目链接
于是这个题坚定了我写记忆化搜索的决心。。。不知为何,就是觉得记忆化搜索比dp直观,好想。dp是一写就错。
这个题明显记忆化搜索比dp方便的多,不知道为啥网上的题解都用四维dp写个百八十行。。。
d
p
[
i
]
[
j
]
[
f
l
a
g
]
dp[i][j][flag]
dp[i][j][flag]为两个兵种分别剩了i,j个,最后为flag兵种的情况。
下面是ac代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <vector>
#include <cmath>
#include <algorithm>
#include <queue>
#include <map>
#include <cstdlib>
#include <unordered_map>
#define ll long long
using namespace std;
const int N = 1e5+5;
const ll mod = 1e8;
ll dp[128][128][2];
int k1, k2;
int cnt0, cnt1;
ll dfs(int cur, int l, int r, int flag)
{
if (dp[l][r][flag] != -1) return dp[l][r][flag];
if (cur < 0) return 0;
if (cur == 0) return 1;
ll ans = 0;
if (flag)
for (int i = 1; i <= min(l, k1); i++)
ans = (ans + dfs(cur-i, l-i, r, flag^1))%mod;
else
for (int i = 1; i <= min(r, k2); i++)
ans = (ans + dfs(cur-i, l, r-i, flag^1))%mod;
return dp[l][r][flag] = ans;
}
int main()
{
int n1, n2;
scanf("%d%d%d%d", &n1, &n2, &k1, &k2);
memset(dp, -1, sizeof(dp));
printf("%lld\n", (dfs(n1+n2, n1, n2, 1)+ dfs(n1+n2, n1, n2, 0))%mod);
return 0;
}
至此,发誓能用记忆化搜索的,绝不用dp。。。哎。我太憨批了。