hdu 2089 不要62(数位dp/记忆化搜索)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2089

题意

查询 $[l,r]$ 区间中有多少数字不含 $4$ 或 $62$ 。

题解

数位dp模板题。

代码

#include <bits/stdc++.h>
using namespace std;
const int LEN = 12;

int dp[LEN][10];
int digit[LEN];

void init() {
    dp[0][0] = 1;
    for (int i = 1; i <= LEN; i++)
        for (int j = 0; j < 10; j++)
            for (int k = 0; k < 10; k++) {
                if (j == 4 or (j == 6 and k == 2))
                    continue;
                dp[i][j] += dp[i - 1][k];
            }
}

int solve(int n) {
    int len = 0;
    while (n) digit[++len] = n % 10, n /= 10;
    digit[len + 1] = 0;
    int ans = 0;
    for (int i = len; i >= 1; i--) {
        for (int j = 0; j < digit[i]; j++) {
            if (j == 4 or (digit[i + 1] == 6 and j == 2))
                continue;
            ans += dp[i][j];
        }
        if (digit[i] == 4 or (digit[i] == 2 and digit[i + 1] == 6))
            break;
    }
    return ans;
}

int main() {
    init();
    int l, r;
    while (cin >> l >> r and (l or r))
        cout << solve(r + 1) - solve(l) << "\n";
}

 

posted @ 2020-06-03 23:50  Kanoon  阅读(193)  评论(0)    收藏  举报