zoukankan      html  css  js  c++  java
  • 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
    ", solve(r) - solve(l) + check(l));
        }
    }
  • 相关阅读:
    JSON入门之二:org.json的基本用法
    Eclipse下设置tomcat,修改Java代码不必重启tomcat
    maven仓库快速镜像
    ORA-06413连接未打开的错误的原因和解决方法
    .NET WIN7 64位 连接Oracle数据库
    5种方法解除开机密码
    精美的贴子挂件
    同学,同事,KTV聚会的小游戏
    QQ分组图案
    WIN7 XP 已达到计算机的连接数最大值,无法再同此远程计算机连接
  • 原文地址:https://www.cnblogs.com/hznumqf/p/13355089.html
Copyright © 2011-2022 走看看