zoukankan      html  css  js  c++  java
  • HDU 2089

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2089

    Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)

    Problem Description
    杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer)。
    杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就可以消除个别的士司机和乘客的心理障碍,更安全地服务大众。
    不吉利的数字为所有含有4或62的号码。例如:
    62315 73418 88914
    都属于不吉利号码。但是,61152虽然含有6和2,但不是62连号,所以不属于不吉利数字之列。
    你的任务是,对于每次给出的一个牌照区间号,推断出交管局今次又要实际上给多少辆新的士车上牌照了。
     
    Input
    输入的都是整数对n、m(0<n≤m<1000000),如果遇到都是0的整数对,则输入结束。
     
    Output
    对于每个整数对,输出一个不含有不吉利数字的统计个数,该数值占一行位置。
     
    Sample Input
    1 100
    0 0
     
    Sample Output
    80
     
    题解:
    属于简单的数位DP题目。
    我们把定义:
    dp[pos][0]:前一位不是6的,所有长度为pos的数(没有上界限制)中,不含4不含62的数,共有几个。
    dp[pos][1]:前一位是6的,所有长度为pos的数(没有上界限制)中,不含4不含62的数,共有几个。
    (例如:dp[1][0] = 9,即0,1,2,3,5,6,7,8,9九个;
        而dp[1][1] = 8,即0,1,3,5,6,7,8,9八个,因为前一位是6,当前位不能选择2。)
     
    然后我们从高位往低位进行DFS,反向往上逐步求出dp[pos][sta],最终得到答案(这里的具体流程和模板可以参考《数位dp总结 之 从入门到模板》);
     
    AC代码:
    #include<bits/stdc++.h>
    using namespace std;
    int dig[18];
    int dp[18][2];
    
    int dfs(int pos,int pre,bool sta,bool limit)
    {
        //printf("现在求 pos=%d pre=%d sta=%d limit=%d
    ",pos,pre,sta,limit);
        if(pos==0) return 1;
        if(!limit && ~dp[pos][sta])
        {
            //printf("已算好dp[%d][%d]=%d
    ",pos,sta,dp[pos][sta]);
            return dp[pos][sta];
        }
    
        int up=limit?dig[pos]:9;
        int ans=0;
        for(int i=0;i<=up;i++)
        {
            if(i==4) continue;
            if(pre==6 && i==2) continue;
            ans+=dfs(pos-1,i,i==6,limit && i==up);
        }
    
        if(!limit)
        {
            //printf("求得dp[%d][%d]=%d (无上界限制)
    ",pos,sta,ans);
            dp[pos][sta]=ans;
        }
    
        //printf("对于 pos=%d pre=%d sta=%d limit=%d,返回 %d
    ",pos,pre,sta,limit,ans);
        return ans;
    }
    int solve(int x)
    {
        int pos=0;
        while(x)
        {
            dig[++pos]=x%10;
            x/=10;
        }
        return dfs(pos,0,0,1);
    }
    
    int main()
    {
        int l,r;
        while(scanf("%d%d",&l,&r) && (l!=0 || r!=0))
        {
            memset(dp,-1,sizeof(dp));
            printf("%d
    ",solve(r)-solve(l-1));
        }
    }
  • 相关阅读:
    【转载】SAP_ECC6.0_EHP4或SAP_ECC6.0_EHP5_基于Windows_Server_2008R2_和SQL_server_2008下的安装
    使用delphi 开发多层应用(二十四)KbmMW 的消息方式和创建WIB节点
    使用delphi 开发多层应用(二十三)KbmMW 的WIB
    实现KbmMw web server 支持https
    KbmMW 服务器架构简介
    Devexpress VCL Build v2014 vol 14.1.1 beta发布
    使用delphi 开发多层应用(二十二)使用kbmMW 的认证管理器
    KbmMW 4.50.00 测试版发布
    Basic4android v3.80 beta 发布
    KbmMW 认证管理器说明(转载)
  • 原文地址:https://www.cnblogs.com/dilthey/p/8488619.html
Copyright © 2011-2022 走看看