• hud 2089 不要62 (数位dp)


    #include<stdio.h>
    #include<string.h>
    #include<math.h>
    #define max 10
    int dp[max][3];
    int number[max];
    //dp[i][0] 前i位数中不符合要求的总个数
    //dp[i][1] 前i位数中最高位是2的个数
    //dp[i][2] 前i位数中存在含4和有连续62的个数
    void init()
    {
        memset(dp,0,sizeof(dp));
        dp[0][0]=1;
        for(int i=1;i<max;i++)
        {
            dp[i][0]=dp[i-1][0]*9-dp[i-1][1];   //除了4 并不含6+2..的
            dp[i][1]=dp[i-1][0]; //2+,
            dp[i][2]=dp[i-1][2]*10+dp[i-1][0]+dp[i-1][1];
        }
    }
    int len_num(int num)
    {
        int i=0;
        memset(number,0,sizeof(number));
        while(num)
        {
            ++i;
            number[i]=num%10;
            num/=10;
        }
        return i;
    }
    int solve(int num)
    {
        int i,flag=0,count=0;
        int len=len_num(num);
        number[len+1]=0;
        for(i=len;i>0;i--)
        {
            count+=dp[i-1][2]*number[i];
            if(flag)
            {
                count+=dp[i-1][0]*number[i];
            }
            else
            {
                if(number[i]>4) count+=dp[i-1][0];
                if(number[i]>6) count+=dp[i-1][1];
                if(number[i]>2&&number[i+1]==6) count+=dp[i][1];//等于62是这个本身不用算在里面  只有大于2才会完全计算
                if((number[i]==2&&number[i+1]==6)||number[i]==4)
                flag=1; 
            }
        }
        return num-count;
    }
    int main(void)
    {
        init();
        int n,m,i,j;
        while(scanf("%d%d",&n,&m)&&n&&m)
        {
            printf("%d
    ",solve(m+1)-solve(n));
        }
        return 0;
    }
  • 相关阅读:
    关于C++类中的静态数据成员
    关于C++中char,sizeof,strlen,string
    C++学习笔记(7)
    C++学习笔记(6)
    C++学习笔记(指针)
    C++学习笔记(4)
    UVA 10780
    UVA 531
    HDU, 3579 Hello Kiki
    UVA, 10413 Crazy Savages
  • 原文地址:https://www.cnblogs.com/woshijishu3/p/3737570.html
Copyright © 2020-2023  润新知