zoukankan      html  css  js  c++  java
  • 洛谷P2602 [ZJOI2010]数字计数 题解

    题目描述

    输入格式

    输出格式

    输入输出样例

    输入样例

    1 99

    输出样例

    9 20 20 20 20 20 20 20 20 20

    说明/提示

    数据规模与约定

    分析

    很裸的一道数位DP的板子

    定义f[当前枚举到的数位][当前数位之前的答案][枚举的数字]

    其它的套板子就可以了,要注意一下前缀0的判断

    代码

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<algorithm>
     4 #include<iostream>
     5 #include<queue>
     6 #include<cmath>
     7 using namespace std;
     8 typedef long long ll;
     9 ll f[20][20][20],num[30];
    10 ll a,b;
    11 ll asd(ll now,ll tot,ll ask,ll jud,ll zer){
    12     if(now<0){
    13         return tot;
    14     }
    15     if(f[now][tot][ask]!=-1 && jud==0 &&(ask || !zer)){
    16         return f[now][tot][ask];
    17     }
    18     ll mmax=9;
    19     if(jud==1) mmax=num[now];
    20     ll anss=0;
    21     for(ll i=0;i<=mmax;i++){
    22         anss+=asd(now-1,tot+( (i==ask) & (!zer || i)),ask,jud&(i==mmax),zer&(i==0));
    23     }
    24     if(!jud && (ask || !zer)) f[now][tot][ask]=anss;
    25     return anss;
    26 }
    27 ll solve(ll xx,ll ask){
    28     ll cnt=0;
    29     memset(num,0,sizeof(num));
    30     while(xx){
    31         ll aa=xx%10;
    32         num[cnt++]=aa;
    33         xx/=10;
    34     }
    35     return asd(cnt-1,0,ask,1,1);
    36 }
    37 int main(){
    38     memset(f,-1,sizeof(f));
    39     scanf("%lld%lld",&a,&b);
    40     for(ll i=0;i<=9;i++){
    41         ll ans=solve(b,i)-solve(a-1,i);
    42         printf("%lld ",ans);
    43     }
    44     printf("
    ");
    45     return 0;
    46 }
    View Code
  • 相关阅读:
    多线程单例模式之立即加载(饿汉模式)
    多线程单例模式之延迟加载(懒汉模式)
    java多线程之ThreadLocal
    java多线程的字符流与字节流
    java多线程生产者消费者
    深入理解多线程三
    深入理解多线程二
    深入java多线程一
    mybatis学习三
    mybatis学习二
  • 原文地址:https://www.cnblogs.com/liuchanglc/p/12749515.html
Copyright © 2011-2022 走看看