首页 > 其他 > 详细

洛谷 P2602 [ZJOI2010]数字计数

时间:2019-07-21 21:07:02      阅读:63      评论:0      收藏:0      [点我收藏+]

技术分享图片

又是一道数位DP,不过做题多了也就发现套路了,这道题注意对前导0的判断以及dp状态的设计——dp[i][j] 当前的位数,统计的数字之和。

#include<cstdio>
#include<cstring> 
using namespace std;
const int maxn=1e6+7;
const int N=550;
long long dp[N][N];
int aaa[maxn];
long long a,b;
long long dfs(int pos,int sum,int num,bool lead,bool limit){
    if(pos==-1) return sum;
    if(!limit&&dp[pos][sum]!=-1&&lead) return dp[pos][sum];
    int up=limit?aaa[pos]:9;
    long long tmp=0;
    for(int i=0;i<=up;i++){
        tmp+=dfs(pos-1,sum+((lead||i)&&(i==num)),num,lead||i,limit&&i==aaa[pos]);
    }
    if(!limit&&lead) dp[pos][sum]=tmp;
    return tmp;
}
long long work(long long x,int now){
    int pos=0;
    while(x){
        aaa[pos++]=x%10;
        x/=10;
    }
    memset(dp,-1,sizeof(dp));
    return dfs(pos-1,0,now,0,1);
}
int main(){
    scanf("%lld%lld",&a,&b);
    for(int i=0;i<=9;i++){
        printf("%lld ",work(b,i)-work(a-1,i));
    } 
    printf("\n");
    return 0;
}

 

洛谷 P2602 [ZJOI2010]数字计数

原文:https://www.cnblogs.com/LJB666/p/11222567.html

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