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. U盘容纳不了大于4G的文件比如ISO文件咋办?

    格式化U盘成NTFS格式就行了,不这么做8,16,32G Upan都容纳不下来.

  2. Servlet的部署开发细节以及注意事项

    学习servlet最困难的我感觉还是配置,一開始是非常麻烦的.为了较好的学习,一開始还是以手动开发我认为比較好,可是真的有点把握给搞晕了,尤其是部署servlet方面非常麻烦,这里做一下简单的总结,前 ...

  3. DirectX11 学习笔记5 - D3DXMath 库

    directx11 特别推出了一个数学库 用于向量 矩阵的计算.并且使用128位 同一时候计算4条32位数据 (SIMD) 之前基本是用的directx10math.h这个头文件.  这个数学库既然是 ...

  4. The most widely used name server software: BIND

    https://www.isc.org/downloads/bind/ The most widely used name server software: BIND BIND is open sou ...

  5. 获取Wifi密码,不知道是不是真的

    package com.example.wifipassword; import java.util.List; import android.app.Activity; import android ...

  6. ajax返回页面停留跳转

    ajax返回数据后,页面停留跳转. 原理:利用匿名函数自动运行的特性和定时器来完成. (function(){ ; // 设置停留时间单位秒 var href =data.url; //设置跳转的ur ...

  7. MapReduce算法形式三:cleanup

    案例三:cleanup 其实这个案例可以不用写这么复杂,不用cleanup也能写,但是为了,突显,突显,突显(重要的事说四遍)cleanup的重要性,琢磨了半天,恩,这样写既可以突显cleanup又显 ...

  8. 根据查询出各地订单商品数量 group by

    order订单表,orderprduct订单商品表,area地区表 SELECT (a1.Name+a2.Name+a3.Name) AS areanaem,orderArea.AreaId,orde ...

  9. proc_create的使用方法

    proc_create的使用方法 proc文件系统是个有用的东东.创建一个proc虚拟文件,应用层通过读写该文件,即可实现与内核的交互.proc虚拟文件是如何创建的呢? 先看看比较简单的,创建proc ...

  10. IDEA maven dependency自动提示

    通过File->setting->maven->repositories,选择本地仓库,点击右上角更新,更新maven仓库索引 在pom.xml编写引入依赖的jar包时,已经下载到本 ...