Loading

HDU2089 不要62 数位DP模板题

DFS套路。

cur ,  x , f , g 分别表示 进行到第cur位,前缀数字是x,f表示是否满数字,g代表是否含前导0

#include<iostream>
#include<algorithm>
#include<bitset>
#include<tuple>
#include<unordered_map>
#include<fstream>
#include<iomanip>
#include<string>
#include<cmath>
#include<cstring>
#include<vector>
#include<map>
#include<set>
#include<list>
#include<queue>
#include<stack>
#include<sstream>
#include<cstdio>
#include<ctime>
#include<cstdlib>
#define INF 0x3f3f3f3f
#define inf 0x7FFFFFFF
#define MOD 998244353
#define moD 1000000003
#define pii pair<int,string>
#define eps 1e-8
#define equals(a,b) (fabs(a-b)<eps)
#define bug puts("bug")
#define re  register
#define fi first
#define se second
const int maxn = 1e6 + 5;
const double Inf = 10000.0;
const double PI = acos(-1.0);
typedef  long long ll;
typedef unsigned long long ull;
using namespace std;

int dp[10][10][2][2];

vector<int> v;
int len;

void init(int n) {
    v.clear();
    while (n) v.push_back(n % 10), n /= 10;
    reverse(v.begin(), v.end());
    len = v.size();
}

int dfs(int cur, int x, bool f, bool g) {
    if (cur == len) return 1;
    if (dp[cur][x][f][g] != -1) return dp[cur][x][f][g];
    int t = 9;
    if (f == 1) t = v[cur];
    int ans = 0;
    for (int i = 0; i <= t; i++) {
        if (i == 4) continue;
        if (g) {
            if (!i) ans += dfs(cur + 1, 0, f & (i == t), 1);
            else  ans += dfs(cur + 1, i, f & (i == t), 0);
        }
        else if (x == 6 && i == 2) continue;
        else {
            ans += dfs(cur + 1, i, f & (i == t), 0);
        }
    }
    return dp[cur][x][f][g] = ans;
}



int solve(int x) {
    init(x);
    memset(dp, -1, sizeof dp);
    return dfs(0, 0, 1, 1);
}

int check(int x) {
    init(x);
    for (int i = 0; i < v.size() - 1; i++) {
        if (v[i] == 6 && v[i + 1] == 2) return 0;
        if (v[i] == 4) return 0;
    }
    if (v.back() == 4) return 0;
    return 1;
}

int main() {
    int l, r;
    while (scanf("%d%d", &l, &r), l || r) {
        printf("%d\n", solve(r) - solve(l) + check(l));
    }
}

 

posted @ 2020-07-21 14:59  MQFLLY  阅读(191)  评论(0编辑  收藏  举报