• Acwing 1085. 不要62 数位DP


    地址 https://www.acwing.com/problem/content/description/1087/

    杭州人称那些傻乎乎粘嗒嗒的人为 62(音:laoer)。
    
    杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就可以消除个别的士司机和乘客的心理障碍,更安全地服务大众。
    
    不吉利的数字为所有含有 462 的号码。例如:62315,73418,88914 都属于不吉利号码。但是,61152 虽然含有 62,但不是 连号,所以不属于不吉利数字之列。
    
    你的任务是,对于每次给出的一个牌照号区间 [n,m],推断出交管局今后又要实际上给多少辆新的士车上牌照了。
    
    输入格式
    输入包含多组测试数据,每组数据占一行。
    
    每组数据包含一个整数对 n 和 m。
    
    当输入一行为“0 0”时,表示输入结束。
    
    输出格式
    对于每个整数对,输出一个不含有不吉利数字的统计个数,该数值占一行位置。
    
    数据范围
    1≤n≤m≤109
    输入样例:
    1 100
    0 0
    输出样例:
    80

    解答 

    数位DP

    // 11235.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
    //
    
    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    const int N = 20;
    
    int dp[N][10];
    
    int l, r;
    
    void init()
    {
        for (int i = 0; i <= 9; i++) dp[1][i] = 1;
        dp[1][4] = 0;
    
        for (int i = 2; i <= N; i++) {
            for (int j = 0; j <= 9; j++) {
                if (j == 4) continue;
                for (int k = 0; k <= 9; k++) {
                    if (k == 4 || (k == 2 && j == 6)) continue;
                    dp[i][j] += dp[i - 1][k];
                }
            }
        }
    }
    
    int dpfunc(int n)
    {
        if (n == 0) return 1;
    
        vector<int> nums;
        while (n != 0) {nums.push_back(n % 10); n = n / 10;}
    
        int ans = 0; int last = 0;
        for (int i = nums.size() - 1; i >= 0; i--) {
            int x = nums[i];
            for (int j = 0; j < x; j++) {
                if (j == 4 || (last == 6 && j == 2)) continue;
                ans += dp[i+1][j];
            }
    
            if (x==4 || (last == 6 && x == 2)) break;
    
            last = x;
            if (i == 0) ans++;
        }
        
    
        return ans;
    }
    
    
    
    
    int main()
    {
        init();
        while (cin >> l >> r, l || r) {
            cout << dpfunc(r) - dpfunc(l - 1) << endl;
        }
    
    
        return 0;
    }
    作 者: itdef
    欢迎转帖 请保持文本完整并注明出处
    技术博客 http://www.cnblogs.com/itdef/
    B站算法视频题解
    https://space.bilibili.com/18508846
    qq 151435887
    gitee https://gitee.com/def/
    欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
    如果觉得不错,欢迎点赞,你的鼓励就是我的动力
    阿里打赏 微信打赏
  • 相关阅读:
    正则表达式
    公司培训文档混淆的基本概念
    堆和栈的区别[导入]
    一個textlist控件(左右兩個文本框)。
    深入浅出之正则表达式(一)
    公司培训文档-c#基础学习
    问题
    [转]CStdioFile中文问题
    VB用户控件制作讲解与实例用户控件属性或函数的描述信息如何写入程序
    什么是表驱动
  • 原文地址:https://www.cnblogs.com/itdef/p/13773036.html
Copyright © 2020-2023  润新知