记忆化搜索(codeforces118D Caesar's Legions)

题目链接
于是这个题坚定了我写记忆化搜索的决心。。。不知为何,就是觉得记忆化搜索比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。。。哎。我太憨批了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值