zoukankan      html  css  js  c++  java
  • HDU-2089 不要62 数位dp

    题目链接:https://cn.vjudge.net/problem/HDU-2089

    题意

    杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer)。
    杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就可以消除个别的士司机和乘客的心理障碍,更安全地服务大众。
    不吉利的数字为所有含有4或62的号码。例如:
    62315 73418 88914
    都属于不吉利号码。但是,61152虽然含有6和2,但不是62连号,所以不属于不吉利数字之列。
    你的任务是,对于每次给出的一个牌照区间号,推断出交管局今次又要实际上给多少辆新的士车上牌照了。

    思路

    数位dp,实质上是按数位的记忆化搜索。
    注意记忆化的状态,[0]表示上一位不是6,[1]表示上一位是6。
    注意limit的传递,还有lead前导零的问题(这里没写)。

    提交过程

    AC

    代码

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    const int maxn=1000000+20;
    int data[maxn][2];
    char num[maxn];
    
    int dp(int pos, bool lim, bool presix){
        if (pos==-1) return 1;
        if (!lim && data[pos][presix]>0)
            return data[pos][presix];
    
        int ans=0, up=lim?(num[pos]-'0'):9;
        for (int i=0; i<=up; i++){
            if (i==4) continue;
            if (presix && i==2) continue;
            // if (lead && pos==0 && i==0) continue;
    
            ans+=dp(pos-1, lim && i==up, i==6);
        }
        
        if (!lim) data[pos][presix]=ans;
        return ans;
    }
    
    int solve(int n){
        sprintf(num, "%d", n);
        int len=strlen(num);
        reverse(num, num+len);
        return dp(len-1, true, false);
    }
    
    int main(void){
        int n, m, ans[2];
    
        memset(data, -1, sizeof(data));
        while (scanf("%d%d", &m, &n)==2 && n){
            printf("%d
    ", solve(n)-solve(m-1));
        }
    
        return 0;
    }
    
    
    Time Memory Length Lang Submitted
    9036kB 900 G++ 2018-08-15 07:53:28
  • 相关阅读:
    2021软工-提问回顾与个人总结
    2021软工-调研作业-Notion
    2021年软工-个人阅读作业2
    tester
    tableau学做两个集合的维恩图(文氏图)Venn diagram 二维文氏图
    python学习
    pv操作是否会造成死锁呢?
    提问的正确姿势
    【BUAA OO Unit3】史上最全OpenJML摸索实录
    MVC和三层架构的区别
  • 原文地址:https://www.cnblogs.com/tanglizi/p/9489249.html
Copyright © 2011-2022 走看看