HDU 2089 不要62 (数位DP)

①递归实现

#include<iostream>
#include<cstring>
#define ll long long
using namespace std;
int dp[15][10],digit[15];
void init(){
    memset(dp,0,sizeof(dp));
    dp[0][0]=1;
    for(int i=1;i<=7;i++){
        for(int j=0;j<=9;j++){
            for(int k=0;k<=9;k++){
                if (j != 4 && !(j == 6 && k == 2))
                    dp[i][j]+=dp[i-1][k];
            }
        }
    }
    /*for(int i=0;i<=9;i++){
        for(int j=0;j<=9;j++){
            cout<<dp[i][j]<<' ';
        }
        cout<<endl;
    }*/
}

int solve(int x){
    memset(digit,0,sizeof(0));
    int cnt=0,tmp=x;
    while(tmp){
        digit[++cnt]=tmp%10;
        tmp/=10;
    }
    digit[cnt+1]=0;
    int ans=0;
    for(int i=cnt;i>=1;i--){//从高位向地位;
        for(int j=0;j<digit[i];j++)//由于j<digit[i],所以到最后一位时直接跳过了(即没有判断x),因此后面是m+1和n
            if(digit[i+1]!=6||j!=2)
                ans+=dp[i][j];
        if(digit[i]==4||(digit[i+1]==6&&digit[i]==2))//遇到4或者62直接结束循环;
            break;
    }
    return ans;
}

int n,m;

int main(){
    init();
    while(cin>>n>>m){
        if(!n&&!m) break;
        cout<<solve(m+1)-solve(n)<<endl;//不是solve(m)-solve(n-1);
    }
    return 0;
}

 

posted @ 2020-07-17 18:43  xuanzo  阅读(112)  评论(0编辑  收藏  举报