LuoGuP4127:[AHOI2009]同类分布

本文探讨了一种使用记忆化搜索实现数位DP的方法,通过解决一个具体问题,详细阐述了状态设计、DFS函数实现及长整型返回的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Pre

前前后后交了 \(4\) 次。

Solution

直接枚举模数,就是每一个数的各位数的和,然后 \(dp\) 到了最后判断和是否相等。

学习了记忆化搜索实现的数位 \(dp\) ,发现挺好用的。

Code

#include <cstdio>
#include <cstring>
#define ll long long
using namespace std;
const ll N = 20, M = 200;
ll dp[N][M][M], a[N], len, mod;
inline ll dfs (int p, int limit, int st, int pre) {
    if (!p) {
        if (st == mod && !pre) return 1;
        else return 0;
    }
    if (!limit && dp[p][st][pre] != -1) return dp[p][st][pre];
    ll res = 0;
    for (int i = 0; i <= (limit ? a[p] : 9); ++i) {
        res += dfs (p - 1, limit && (i == a[p]), st + i, (pre * 10 + i) % mod);
    }
    if (!limit)
        dp[p][st][pre] = res;
    return res;
}
inline ll solve (ll lhjakioi) {
    if (!lhjakioi) return 0;
    len = 0;
    while (lhjakioi) {
        a[++len] = lhjakioi % 10;
        lhjakioi /= 10;
    }
    ll ans = 0;
    for (mod = 1; mod <= 162; ++mod) {
        memset (dp, -1, sizeof (dp));
        ans += dfs (len, 1, 0, 0);
    }
    return ans;
}
signed main () {
    #ifdef chitongz
    freopen ("x.in", "r", stdin);
    #endif
    ll a, b;
    scanf ("%lld%lld", &a, &b);
    printf ("%lld\n", solve (b) - solve (a - 1));
    return 0;
}

Conclusion

作为记忆化搜索实现数位 \(dp\) 的第一题, \(WA\) 了三次。

第一次,第二次是 \(dp\) 的状态设计错误,没有记录当前的数模枚举的 \(mod\) 的值。

第三次是没有 \(dfs\) 函数没有返回 \(long\ long\)

转载于:https://www.cnblogs.com/ChiTongZ/p/11355886.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值