首页 > 其他 > 详细

数位dp

时间:2020-02-18 22:30:34      阅读:46      评论:0      收藏:0      [点我收藏+]

技术分享图片

代码:

#include<iostream>
#include<stdio.h>
using namespace std;
typedef long long ll;
int a[20];
ll dp[20][2];
//if6:当前为是否为6;limit:上一位是否是上界 
ll dfs(int len,bool if6,bool limit){
    if(len==0) return 1ll;
    if(!limit&&dp[len][if6]) return dp[len][if6];
    ll cnt = 0,up_bound=(limit?a[len]:9);
    for(int i=0;i<=up_bound;i++){
        if(if6&&i==2)
            continue;
        if(i==4)
            continue;
        cnt+=dfs(len-1,i==6,limit&&i==up_bound);
    } 
    if(!limit) dp[len][if6] = cnt;
    return cnt; 
}
ll solve(ll x){
    int pos = 0;
    while(x){
        a[++pos]=x%10;
        x/=10;
    }
    return dfs(pos,false,true);
}
int main(){
    ll n,m;
    while(cin>>n>>m&&(n+m)){
        cout<<solve(m)-solve(n-1)<<endl;
    }    
    return 0;
}

 

数位dp

原文:https://www.cnblogs.com/lusiqi/p/12328270.html

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