数位dp-入门模板题 hdu2089

#include<bits/stdc++.h>
using namespace std;
int dp[11][10],n,m;
void init(){//dp[i][j]:i位的数,最高位是j 
    dp[0][0]=1;
    for(int i=1;i<=7;i++)
        for(int j=0;j<10;j++)
            for(int k=0;k<10;k++)
                if(j!=4 && !(j==6 && k==2))
                    dp[i][j]+=dp[i-1][k]; 
}
int solve(int n){//求[0,n)范围合法的个数 
    int res=0,len=0,d[11]={}; 
    while(n)d[++len]=n%10,n/=10;
    d[len+1]=0;
    for(int i=len;i>=1;i--){//从高到低枚举每位 
        for(int j=0;j<d[i];++j)//枚举最高位的数 
            if(d[i+1]!=6 || j!=2)
                res+=dp[i][j];
        if(d[i]==4 || d[i+1]==6 && d[i]==2)break;//后面的都不用枚举了 
    } 
    return res;
}
int main(){
    init();
    while(cin>>n>>m,m)cout<<solve(m+1)-solve(n)<<endl; 
}
原文地址:https://www.cnblogs.com/zsben991126/p/10675834.html