首页 > 其他 > 详细

数位dp-入门模板题 hdu2089

时间:2019-04-09 11:51:07      阅读:327      评论:0      收藏:0      [点我收藏+]
#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; 
}

 

数位dp-入门模板题 hdu2089

原文:https://www.cnblogs.com/zsben991126/p/10675834.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!