HDU2089 不要62

依旧是数位dp问题,这里只需要预处理dp数组为前i位,当前位填j的合法方案有多少种,

然后套数位dp的板子就行

#include<iostream>
#include<vector>
using namespace std;
const int N=10;
int f[N][10];
int n,m;
void init(){
    int i,j;
    for(i=0;i<=9;i++){
        f[1][i]=i!=4?1:0;
    }
    int k;
    for(i=2;i<N;i++){
        for(j=0;j<=9;j++){
            if(j==4)
            continue;
            for(k=0;k<=9;k++){
                if(k==4||(j==6&&k==2))
                continue;
                f[i][j]+=f[i-1][k];
            }
        }
    }
}
int dp(int n){
    if(!n)
    return 1;
    vector<int> num;
    while(n){
        num.push_back(n%10);
        n/=10;
    }
    int last=0;
    int res=0;
    for(int i=num.size()-1;i>=0;i--){
        int x=num[i];
        int j;
        for(j=0;j<x;j++){
            if(j==4||(j==2&&last==6))
            continue;
            res+=f[i+1][j];
        }
        if((last==6&&x==2)||x==4)
            break;
        last=x;
        if(!i)
        res++;
    }
    return res;
}
int main(){
    init();
    while(cin>>n>>m){
        if(n==0&&m==0)
        break;
        cout<<dp(m)-dp(n-1)<<endl;
    }
    return 0;
}
View Code

 

posted @ 2020-04-08 15:38  朝暮不思  阅读(108)  评论(0编辑  收藏  举报