zoukankan      html  css  js  c++  java
  • HDU 2089 不要62(数位DP)

    不要62

    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
     

    分析:把状态分为3种,1)不包含不吉利数且末位不为6。2)不包含不吉利数且末位为6。3)包含不吉利数。 状态转移见代码注释。

    代码如下:

     1 # include<stdio.h>
     2 # include<string.h>
     3 int dp[10][3],N;
     4 int digit[15];
     5 void init(){
     6     memset(dp,0,sizeof(dp));
     7     dp[0][0] = 1;
     8     for(int i =1; i<=9; i++){
     9         dp[i][0] = dp[i-1][0]*9 - dp[i-1][1];
    10         //不含不吉利的数的个数:去掉①含有4的②含有62的  
    11         dp[i][1] = dp[i-1][0];
    12         //不含有不吉利的数的个数:以2开头的数的个数  
    13         dp[i][2] = dp[i-1][2]*10 + dp[i-1][1] + dp[i-1][0];
    14         //含有不吉利的数的个数:①含有62的个数②以4开头的个数
    15     }
    16 }
    17 
    18 int DP(int num){
    19     int len,ans,temp,flag;
    20     memset(digit,0,sizeof(digit));
    21     temp = num;
    22     flag  = len = ans =0;
    23     while(num){
    24         digit[++len] = num%10;
    25         num /= 10;
    26     }
    27     for(int i=len; i>0; i--){
    28         ans += dp[i-1][2]*digit[i];    //不吉利的数
    29         if(flag)
    30             ans += dp[i-1][0]*digit[i];    //前面已经出现了不吉利的数
    31         else{
    32             if(digit[i]>4)                             ans += dp[i-1][0];
    33             if(digit[i] >6)                            ans += dp[i-1][1];
    34             if(digit[i+1]==6 && digit[i]>2)            ans += dp[i][1];
    35         }
    36         if(digit[i+1]==6 && digit[i]==2 || digit[i]==4)
    37             flag = 1;
    38     }
    39     return temp - ans;
    40 }
    41 int main(){
    42     init();
    43     int n,m;
    44     while(scanf("%d%d",&n,&m),n&&m){
    45         printf("%d
    ",DP(m+1)-DP(n));
    46     }
    47     return 0;
    48 }

     另外本体还可以暴搜:

     1 # include<stdio.h>
     2 # include<string.h>
     3 int dp[1000010];
     4 bool f(int i){
     5     while(i){
     6         if(i%10==4||i%100==62)
     7             return 1;
     8         i/=10;
     9     }
    10     return 0;
    11 }
    12 int main(){
    13     int n,m;
    14     int ans,count;
    15     memset(dp,0,sizeof(dp));
    16     for(int i=1; i<1000000; i++)
    17         if(f(i))
    18             dp[i]=1;
    19     while(scanf("%d%d",&n,&m),n&&m){
    20         ans=0;
    21         for(int i=n; i<=m; i++)
    22             if(dp[i]==0)
    23                 ans++;
    24         printf("%d
    ",ans);
    25     }
    26     return 0;
    27 }
  • 相关阅读:
    Open source cryptocurrency exchange
    Salted Password Hashing
    95. Unique Binary Search Trees II
    714. Best Time to Buy and Sell Stock with Transaction Fee
    680. Valid Palindrome II
    Java compiler level does not match the version of the installed Java project facet.
    eclipse自动编译
    Exception in thread "main" java.lang.StackOverflowError(栈溢出)
    博客背景美化——动态雪花飘落
    java九九乘法表
  • 原文地址:https://www.cnblogs.com/acm-bingzi/p/3297810.html
Copyright © 2011-2022 走看看