洛谷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("\n");
45     return 0;
46 }
View Code

猜你喜欢

转载自www.cnblogs.com/liuchanglc/p/12749515.html
今日推荐