https://www.luogu.org/problemnew/show/P2602

第二道数位dp,因为“数位dp都是模板题”(误),所以是从第一道的基础上面改的。

核心思想就是分类讨论,分不同情况讨论对答案的贡献。

最最重要的是,该数位取与当前位相等的时候,贡献的个数是受这个数位影响的所有数(这个写法里包括它本身),那么就用x减去与x前缀相同的“整数”再+1就可以算出来了。

其他的数位dp……好像就不太会写了,再研究一下。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll dp[][][];
ll pow10[]; ll sum(int i,int j1,int j2,int k){
if(j1<)
j1=;
if(j2>)
j2=;
ll res=;
for(int j=j1;j<=j2;j++){
res+=dp[i][j][k];
}
return res;
} void init(){
pow10[]=;
for(int i=;i<=;i++){
pow10[i]=pow10[i-]*;
} for(int j=;j<=;j++)
dp[][j][j]=;
for(int i=;i<=;i++){
for(int j=;j<=;j++){
for(int k=;k<=;k++){
dp[i][j][k]=sum(i-,,,k);
if(j==k){
dp[i][j][k]+=pow10[i-];
}
}
}
} /*for(int j=1;j<=2;j++){
dp[9][j]=sum(8,0,j-2)+sum(8,j+2,9);
}*/ /*for(int i=1;i<=13;i++){
for(int j=0;j<=9;j++){
for(int k=0;k<=9;k++)
printf("dp[%d][%d][%d]=%d\n",i,j,k,dp[i][j][k]);
}
printf("\n");
}*/
} ll A,B;
int digit[]; int w; ll count(ll x){
//cout<<"x="<<x<<endl;
if(x<)
return ;
if(x==){
if(w==)
return ;
else
return ;
}
//否则岂不是0位数?
ll k=,cx=x;
digit[k++]=;
//占位用的
while(cx){
digit[k++]=cx%;
cx/=;
}
k--;
digit[k+]=;
//也是占位 ll res=;
for(int i=k;i>=;i--){
//printf("i=%d res=%d\n",i,res);
if(i==k){
//最高位取0
for(int ii=i-;ii>=;ii--){
res+=sum(ii,,,w);
//printf("you want=%d\n",res);
}
if(w==)
res+=;//0
//其实不用特判啊
for(int j=;j<digit[i];j++){
//最高位比digit小且不为0 if(i->=){
if(j==w)
res+=pow10[i-];
res+=sum(i-,,,w);
}
else{
if(j==w)
res+=;
}
}
//最高位就取相等,问题留给下一次循环
//取相等怎么会是满的呢?
if(digit[i]==w)
res+=(x-x/pow10[i-]*pow10[i-]+);
}
else{
//前面的位都相等,非最高位的情况
for(int j=;j<digit[i];j++){
if(i->=){
if(j==w)
res+=pow10[i-];
res+=sum(i-,,,w);
}
else{
if(j==w)
res+=;
}
}
if(digit[i]==w)
res+=(x-x/pow10[i-]*pow10[i-]+);
}
} //一直相等的情况在上面自动处理了,不用另外处理
/*for(int i=1;i<=k;i++){
if(digit[i]==w){
res++;
}
}*/
//printf("res=%d\n",res);
return res;
} int main(){
init();
while(~scanf("%lld%lld",&A,&B)){
for(w=;w<=;w++)
printf("%lld%c",count(B)-count(A-)," \n"[w==]);
}
}

后来学会了搜索写法。

洛谷 - P2602 - 数字计数 - 数位dp的更多相关文章

  1. 洛谷P2602 数字计数 [ZJOI2010] 数位dp

    正解:数位dp 解题报告: 传送门! 打算在寒假把学长发过题解的题目都做辣然后把不会的知识点都落实辣! ⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄ 然后这道题,开始想到的时候其实想到的是大模拟,就有点像之前考试贪 ...

  2. 【题解】P2602 数字计数 - 数位dp

    P2602 [ZJOI2010]数字计数 题目描述 给定两个正整数 \(a\) 和 \(b\) ,求在 \([a,b]\) 中的所有整数中,每个数码(digit)各出现了多少次. 输入格式 输入文件中 ...

  3. 洛谷P2602 [ZJOI2010]数字计数(数位dp)

    数字计数 题目传送门 解题思路 用\(dp[i][j][k]\)来表示长度为\(i\)且以\(j\)为开头的数里\(k\)出现的次数. 则转移方程式为:\(dp[i][j][k] += \sum_{t ...

  4. Luogu P2602 [ZJOI2010]数字计数 数位DP

    很久以前就...但是一直咕咕咕 思路:数位$DP$ 提交:1次 题解:见代码 #include<cstdio> #include<iostream> #include<c ...

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

    1833: [ZJOI2010]count 数字计数 Time Limit: 3 Sec  Memory Limit: 64 MBSubmit: 2494  Solved: 1101[Submit][ ...

  6. 洛谷 - P2657 - windy数 - 数位dp

    https://www.luogu.org/problemnew/show/P2657 不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. 这道题是个显然到不能再显然的数位dp了. 来个 ...

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

    1833: [ZJOI2010]count 数字计数 题目:传送门 题解: 今天是躲不开各种恶心DP了??? %爆靖大佬啊!!! 据说是数位DP裸题...emmm学吧学吧 感觉记忆化搜索特别强: 定义 ...

  8. BZOJ 1833 数字计数 数位DP

    题目链接 做的第一道数位DP题,听说是最基础的模板题,但还是花了好长时间才写出来..... 想深入了解下数位DP的请点这里 先设dp数组dp[i][j][k]表示数位是i,以j开头的数k出现的次数 有 ...

  9. UVA.1640.The Counting Problem / BZOJ.1833.[ZJOI2010]数字计数(数位DP)

    题目链接 \(Description\) 求\([l,r]\)中\(0,1,\cdots,9\)每个数字出现的次数(十进制表示). \(Solution\) 对每位分别DP.注意考虑前导0: 在最后统 ...

随机推荐

  1. C++字符串转数字,数字转字符串

    1. 字符串转数字 如将"32"转为32,将"3.1415"转为3.1415,将"567283"转为567283.使用: //Convert ...

  2. 小博客| 登录 | 注册 | 留言 | 提Bug 小博客

     浏览(1502)  赞(29) 一直以来都想开发一个自己的网站,总想做一个网站然后让千千万万的人去访问,去使用,然后收到热烈的好评, 再然后某某著名机构有意投资我的网站(其实收购也是没有问题的), ...

  3. HDU 2108 Shape of HDU (判断是不是凸多边形 叉乘)

    Shape of HDU Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tota ...

  4. 使用dataguard将单实例数据库转换为rac数据库

    我们常常将oracle rac数据库通过dataguard容灾到一个单实例数据库中.当生产库出现问题后能够将生产库切换到dgserver上.而当生产库rac修复完毕后.我们相同能够通过dg将数据回切到 ...

  5. 让Spring Boot启动更快

    关注公众号:锅外的大佬, 每日推送国外技术好文,帮助每位开发者更好成长 原文链接:https://dev.to/bufferings/lets-make-springboot-app-start-fa ...

  6. notpad++快捷键

    Notpad++快捷键 Notepad++选中行操作 快捷键 使用技巧 作者: Rememberautumn 分类: 其他 发布时间: 2014-09-04 14:18 阅读: 60,106  微信小 ...

  7. 《STL源代码剖析》---stl_deque.h阅读笔记(2)

    看完,<STL源代码剖析>---stl_deque.h阅读笔记(1)后.再看代码: G++ 2.91.57,cygnus\cygwin-b20\include\g++\stl_deque. ...

  8. 经常使用 Java API

    经常使用Java API 一. java.io.BufferedReader类(用于从文件里读入一段字符.所属套件:java.io) 1. 构造函数BufferedReader(java.io.Fil ...

  9. 小心APP应用让你成为“透明人”

    随着智能手机和平板电脑的迅猛发展,各式各样的APP在涌入这些移动终端的同一时候.吸费.窃取隐私等恶意程序也随之盛行. watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5u ...

  10. positive 相对其正常位置,那什么是正常位置: 请问调试,请问浏览器

    [问题代码 <!DOCTYPE html><html><head> <title></title> <meta charset=&qu ...