HDU 2089 数位dp解法

传送门
(数位dp入门题)
题意: 就是求给定区间内数字中不含4和连号62

思路: 很入门的数位dp, dp[len][state] 表示当前第len 位,并且前一位是否是6, 然后记忆化搜索即可, 因为每到一个位置的数字, 都有两种状态, 需要分开考虑.

ll dp[30][2], shu[30];
ll dfs(int st, int state, int limit) {
    if (st < 1) return 1; // 返回状态
    if (!limit && dp[st][state] != -1) return dp[st][state];
    int up = limit ? shu[st] : 9;
    ll res = 0;
    for (int i = 0 ; i <= up ; ++ i) {
        if (i == 4 || (state && i == 2)) continue;
        res += dfs(st-1, i == 6, limit && i == up);
    }
    if (!limit) dp[st][state] = res;
    return res;
}
ll cal(ll x) {
    int k = 0;
    while(x) {
        shu[++k] = x % 10;
        x /= 10;
    }
    return dfs(k, 0, 1);
}
void solve() {
    ll l, r;
    while(~scanf("%lld%lld", &l, &r)) {
        if (l + r == 0) break;
        if (l > r) swap(l, r);
        printf("%lld\n", cal(r) - cal(l-1));
    }
}

你可能感兴趣的:(数位dp)