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. add swapspace file on ubuntu.

    https://askubuntu.com/questions/566745/allocate-swap-after-ubuntu-14-04-lts-installation ----------- ...

  2. centos 複製時顯示進度的指令 pv

    Pipe Viewer 的简称pv:意思是通过管道显示数据处理进度的信息.这些信息包括已经耗费的时间,完成的百分比(通过进度条显示),当前的速度,全部传输的数据,以及估计剩余的时间. yum inst ...

  3. RecyclerView的万能切割线

    效果图: 用法: 加入默认切割线:高度为2px.颜色为灰色 mRecyclerView.addItemDecoration(new RecycleViewDivider(mContext, Linea ...

  4. Oracle创建索引的原则(转)

    Oracle 建立索引及SQL优化 数据库索引: 索引有单列索引复合索引之说 如何某表的某个字段有主键约束和唯一性约束,则Oracle 则会自动在相应的约束列上建议唯一索引.数据库索引主要进行提高访问 ...

  5. php使用魔法函数和不使用魔法函数比较

    /** * use magic 0.31868386268616s * not use magic 0.11876797676086s */ class Test { private $varstr ...

  6. Android自己定义圆角ImageView

    我们常常看到一些app中能够显示圆角图片.比方qq的联系人图标等等,实现圆角图片一种办法是直接使用圆角图片资源,当然假设没有圆角图片资源.我们也能够自己通过程序实现的,以下介绍一个自己定义圆角Imag ...

  7. ArcGIS教程:分水岭

    摘要 确定栅格中一组像元之上的汇流区域. 使用方法 · 各个分水岭的值将取自输入栅格中源的值或者要素倾泻点数据.假设倾泻点为栅格数据集,则使用像元值.假设倾泻点为点要素数据集,则从指定的字段中获取值. ...

  8. iOS之UI--使用SWRevealViewController 实现侧边菜单功能详解实例

     iOS之UI--使用SWRevealViewController 实现侧边菜单功能详解实例 使用SWRevealViewController实现侧边菜单功能详解 下面通过两种方法详解SWReveal ...

  9. LeetCode(27)题解:Remove Element

    https://leetcode.com/problems/remove-element/ Given an array and a value, remove all instances of th ...

  10. NIO原理图