BZOJ1833: [ZJOI2010]count 数字计数 (数位dp)

传送门

数位dp... ...大概都是这个套路吧... ...

写这个的时候直接水了一发... ...我也不知道自己写的是不是dp... ...

大概是主要内容和dp关系不大的dp... ...

mark代码..细长的代码真是丑啊..换行太频繁了....

 1 #include<cmath>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<iostream>
 5 #include<algorithm>
 6 #include<queue>
 7 using namespace std;
 8 long long a,b;
 9 long long f[15][5]={};
10 int shu[15]={};
11 long long zz[15]={};
12 long long ans[15]={};
13 void doit(long long x,long long fu){
14     memset(shu,0,sizeof(shu));
15     int k=0;
16     long long y=x;
17     while(y){
18         shu[++k]=y%10;
19         y/=10;
20     }
21     long long t;
22     for(int i=1;i<=9;i++){
23         for(int j=k;j>1;j--){
24             if(shu[j]>i){
25                 t=shu[j]*f[j-1][1]+zz[j];
26             }
27             else{
28                 t=shu[j]*f[j-1][1];
29             }
30             ans[i]+=fu*t;
31             if(shu[j]==i){
32                 ans[i]+=(x%zz[j]+1)*fu;
33             }
34         }
35         if(shu[1]>=i){
36             ans[i]+=fu;
37         }
38     }
39
40     for(int j=k;j>1;j--){
41         if(j==k){
42             t=(shu[j]-1)*f[j-1][1];
43         }
44         else if(shu[j]>0){
45             t=shu[j]*f[j-1][1]+zz[j];
46         }
47         else{
48             t=shu[j]*f[j-1][1];
49         }
50         ans[0]+=fu*t;
51         if(shu[j]==0){
52             ans[0]+=(x%zz[j]+1)*fu;
53         }
54     }
55     if(shu[1]>=0){
56         ans[0]+=fu;
57     }
58     if(k>1){
59         ans[0]+=fu*f[k-1][0];
60     }
61 }
62 int main(){
63     long long t=1;
64     f[0][0]=1;
65     for(int i=1;i<=13;i++){
66         f[i][1]=f[i-1][1]*10+t;
67         f[i][0]=f[i-1][0]+f[i-1][1]*9;
68         zz[i]=t;
69         t*=10;
70     }
71     scanf("%lld%lld",&a,&b);
72     doit(b,1);
73     doit(a-1,-1);
74     for(int i=0;i<9;i++){
75         printf("%lld ",ans[i]);
76     }
77     printf("%lld\n",ans[9]);
78     return 0;
79 }

时间: 2024-10-07 10:27:38

BZOJ1833: [ZJOI2010]count 数字计数 (数位dp)的相关文章

bzoj1833: [ZJOI2010]count 数字计数(数位DP+记忆化搜索)

1833: [ZJOI2010]count 数字计数 题目:传送门 题解: 今天是躲不开各种恶心DP了??? %爆靖大佬啊!!! 据说是数位DP裸题...emmm学吧学吧 感觉记忆化搜索特别强: 定义f[i][j][k]表示若前i个位置有k个j的此时的全局方案数,然后就可以记忆化搜索了(具体看代码吧) 代码: 1 #include<cstdio> 2 #include<cstring> 3 #include<cstdlib> 4 #include<cmath>

【BZOJ-1833】count数字计数 数位DP

1833: [ZJOI2010]count 数字计数 Time Limit: 3 Sec  Memory Limit: 64 MBSubmit: 2494  Solved: 1101[Submit][Status][Discuss] Description 给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次. Input 输入文件中仅包含一行两个整数a.b,含义如上所述. Output 输出文件中包含一行10个整数,分别表示0-9在[a,b]中出现了多少次.

BZOJ 1833 ZJOI2010 count 数字计数 数位DP

题目大意:求[a,b]间所有的整数中0~9每个数字出现了几次 令f[i]为i位数(算前导零)中每个数出现的次数(一定是相同的,所以只记录一个就行了) 有f[i]=f[i-1]*10+10^(i-1) 然后照例十进制拆分 其中计算[0,999...9]的时候要从1~9枚举最高位,然后其余位调用f[i-1]即可 剩余部分已知位直接乘,未知位调用f[i] #include<cstdio> #include<cstring> #include<iostream> #includ

数位DP入门:bzoj1833: [ZJOI2010]count 数字计数

膜拜了一下蔡大神....然后突然想起来一些东西然后就填了一个半年多前的坑= = 人生第一道自己写的数位DP...好吧以前是看题解然后也不知道为什么就过了的>_< 数位DP介绍: http://wenku.baidu.com/link?url=9OS5Ybpw5wx00ahrH8ED2oyIlR1uWwrxT8N4pEg27GgBt2T2hLe4sd_h1rmpY7P0HmeHIEDw9h6_K98dPhhjoMhD2TpKcS8w1X8cC_dkPp_ 接下来是题目地址: http://www

BZOJ1833 [ZJOI2010]count 数字计数 【数学 Or 数位dp】

题目 给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次. 输入格式 输入文件中仅包含一行两个整数a.b,含义如上所述. 输出格式 输出文件中包含一行10个整数,分别表示0-9在[a,b]中出现了多少次. 输入样例 1 99 输出样例 9 20 20 20 20 20 20 20 20 20 提示 30%的数据中,a<=b<=10^6: 100%的数据中,a<=b<=10^12. 题解 你以为我真的会写数位dp? 首先容斥一下,转化为求小于等于

BZOJ 1833 ZJOI 2010 count 数字计数 数位DP

题目大意:问0~9这10个数字在[l,r]中出现过多少次. 思路:数位DP.以前只是听说过,并没有写过,写了才发现好闹心啊.. 预处理一个数组,f[i][j][k]表示长度为i,开头为j,数字k出现的次数. 对于一个数kXXXXXX,我们先处理1~999999,然后处理1000000~kXXXXXX 前面的东西很规则,可以直接调用f数组来解决. 对于后面不太规则的东西,按位处理.总之就是乱搞,我也不太懂说不明白... CODE: #include <cstdio> #include <c

bzoj1833: [ZJOI2010]count 数字计数 &amp;&amp; codevs1359 数字计数

bzoj1833 codevs1359 这道题也是道数位dp 因为0有前导0这一说卡了很久 最后发现用所有位数减1~9的位数就okay.....orzczl大爷 其他就跟51nod那道统计1出现次数一样啦 #include<cstdio> #include<cstring> #include<algorithm> #define LL long long using namespace std; LL read(){ LL ans=0,f=1,c=getchar();

bzoj1833 [ZJOI2010]count 数字计数

题目链接 我是DP弱者!!!我是DP弱者!!!我是DP弱者!!! 调了好久,数位DP好恼火QAQ 1 #include<algorithm> 2 #include<iostream> 3 #include<cstdlib> 4 #include<cstring> 5 #include<cstdio> 6 #include<string> 7 #include<cmath> 8 #include<ctime> 9

【BZOJ1833】【ZJOI2010】数字计数 数位DP

链接: #include <stdio.h> int main() { puts("转载请注明出处[辗转山河弋流歌 by 空灰冰魂]谢谢"); puts("网址:blog.csdn.net/vmurder/article/details/46444975"); } 题解: 然而并没有DP. [1,R]的答案减去[1,L]的答案. 对于一个数 X ,求 [1,X] 的答案,我是先处理出 [1,999--9] 的答案(那个999--9 < X) 然后按