数位dp HDU

https://cn.vjudge.net/problem/HDU-2089

题意:

题意:给定一个区间,求区间中不包含4、连续的62的数字有几个。

分析:基础的数位dp,利用开多维的dp数组和 dfs 的多个参数来实现各种限制条件,从高位到低位dfs,并且多用 if 判断,结尾 return 1。   ( 用dig[] 保存数位,ans 基本框架为 sol(m) - sol(n - 1) )

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;

const int maxn = 30;
int dig[maxn];
int dp[maxn][2][2];

int dfs(int pos, int six, int flag) {
    if (pos < 0) return 1;
    if (dp[pos][six][flag] != -1) return dp[pos][six][flag];
    int res = 0;
    for (int i = 0; i <= 9; i++) {
        if (six && i == 2) continue;
        if ( i == 4) continue;
        if (flag && i > dig[pos]) continue;
        res += dfs( pos - 1, i == 6, flag && i == dig[pos] );
    }
    return dp[pos][six][flag] = res;
}

int sol(int x) {
    if (x < 0) return 0;
    memset(dp, -1, sizeof(dp));
    int cnt = 0;
    while (x) {
        dig[cnt++] = x % 10;
        x /= 10;
    }
    return dfs(cnt - 1, 0, 1);
}

int main() {
    int n, m;
    while (~scanf("%d%d", &n, &m)) {
        if (n == 0 && m == 0) break;
        printf("%d
", sol(m) - sol(n - 1));
    }
}
原文地址:https://www.cnblogs.com/-Zzz-/p/11415879.html