zoukankan      html  css  js  c++  java
  • hdu2089_数位dp

    http://acm.hdu.edu.cn/showproblem.php?pid=2089

    转载自http://blog.csdn.net/acm_cxlove/article/details/7819907

    n - m 的树中不含4和62的数有多少个

     1 #include<iostream>
     2 #include<cstring>
     3 #include<queue>
     4 #include<cstdio>
     5 #include<cmath>
     6 #include<algorithm>
     7 #define N 55
     8 #define inf 1<<29
     9 #define MOD 9973
    10 #define LL long long
    11 #define eps 1e-7
    12 #define zero(a) fabs(a)<eps
    13 #define equal(a,b) zero(a-b)
    14 using namespace std;
    15 int dp[10][3];
    16 //dp[i][0],表示不存在不吉利数字
    17 //dp[i][1],表示不存在不吉利数字,且最高位为2
    18 //dp[i][2],表示存在不吉利数字
    19 void Init(){
    20     memset(dp,0,sizeof(dp));
    21     dp[0][0]=1;
    22     for(int i=1;i<=6;i++){
    23         dp[i][0]=dp[i-1][0]*9-dp[i-1][1];  //在最高位加上除了4之外的9个数字,但是可能在2之前加了6
    24         dp[i][1]=dp[i-1][0];    //就是在原先不含不吉利数字的最高位加2
    25         dp[i][2]=dp[i-1][2]*10+dp[i-1][0]+dp[i-1][1];  //在已经有不吉利数字最高位加任意数字,或者在无吉利数字前加4,或者在2前面加4
    26     }
    27 }
    28 int slove(int n){
    29     int len=0,bit[10];
    30     int tmp=n;
    31     while(n){
    32         bit[++len]=n%10;
    33         n/=10;
    34     }
    35     bit[len+1]=0;
    36     int ans=0;
    37     bool flag=false;
    38     for(int i=len;i;i--){
    39         ans+=dp[i-1][2]*bit[i];  
    40         if(flag)   //高位已经出现4或者62,后面的就随意
    41             ans+=dp[i-1][0]*bit[i];
    42         if(!flag&&bit[i]>4)  //高位可能出现4的情况
    43             ans+=dp[i-1][0];
    44         if(!flag&&bit[i+1]==6&&bit[i]>2)  //高位是6,后面一位可能出现2,这步debug了很久
    45             ans+=dp[i][1];
    46         if(!flag&&bit[i]>6)  //高位可能出现6,要把后面最高位为2计入
    47             ans+=dp[i-1][1];
    48         if(bit[i]==4||(bit[i+1]==6&&bit[i]==2))  //高位已经出现4或者62
    49             flag=true;
    50     }
    51     return tmp-ans;
    52 }
    53 int main(){
    54     int l,r;
    55     Init();
    56     while(scanf("%d%d",&l,&r)!=EOF&&l+r)
    57         printf("%d
    ",slove(r+1)-slove(l));
    58     return 0;
    59 }
    View Code
  • 相关阅读:
    干货分享:路由与交换详解大全!
    基于ASCII字符集对比
    css文字两端对齐
    软件版本号(BETA、RC、ALPHA、Release、GA等)
    install和update区别
    Blazor入坑指南
    解决Electron7.0.0的坑,cnpm install electron 安装失败的问题
    Linux查看CPU和内存使用情况
    位运算符在JS中的妙用
    centos7通过yum安装mysql
  • 原文地址:https://www.cnblogs.com/luomi/p/5742740.html
Copyright © 2011-2022 走看看