LuoGuP4127:[AHOI2009]同様の分布

インとアウトを支払う\(4 \)回。

溶液

直接列挙弾性率は、すべての数は、あなたの数と、その後です\(DP \)への最終的な判断と平等。

学習とデジタル達成するためのメモリ検索\(DP \)は、非常に良い使用ことがわかりました。

コード

#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;
}

結論

デジタルメモリ検索として実装\(DP \)最初の質問、\(WA \)三回。

第一、第二は、(DP \)\設計エラーの状態、現在のデジタル-アナログ列挙のないレコード\(MOD \)値。

三度目はいませんでした\(DFS \)関数は戻りません(\長い\ロング)\を

おすすめ

転載: www.cnblogs.com/ChiTongZ/p/11355886.html