题目链接:https://cn.vjudge.net/contest/278036#problem/D

题目大意:T组测试数据,每一次输入两个数,求的是在这个区间里面,有多少个0,比如说19203包括一个0,123包括0个0。

具体思路:数位dp,对于当前的这一位的所有情况,先看一下这一位上之前的数是不是都是0,如果都是0的话,那么这一位上即使是0也不能计算在内,因为00还是1个0。dp[i][j]代表的是第i位之前有多少0,注意,对于初始条件,我们设置为这个数的前面也都是0,举个例子1234,我们在枚举第一位的所有情况的时候,如果是0的话,是不应该记录在内的,所以我们设置初始位置也存在前导0.

AC代码:

 #include<iostream>
#include<stack>
#include<iomanip>
#include<cstring>
#include<cmath>
#include<stdio.h>
#include<algorithm>
#include<string>
using namespace std;
# define ll long long
const int maxn =+;
ll dig[maxn],dp[maxn][maxn];
ll dfs(int len,int t,bool head0,bool fp)
{
if(!len)
{
if(head0)//一开始在这个地方卡住了,我们需要记录的是第i位之前存在多少0,那么0的时候就是一个,1-9也是1个。
return ;
return t;
}
if(!fp&&!head0&&dp[len][t]!=-)
return dp[len][t];
ll ans=,fmax = fp?dig[len]:;
for(int i=; i<=fmax; i++)
{
if(head0)
ans+=dfs(len-,,head0&&i==,fp&&i==fmax);//按照递归的形式,只有当前面的都是0的时候,当前这一位也是0的时候,才算是前导0
else
ans+=dfs(len-,t+(i==),head0&&i==,fp&&i==fmax);
}
if(!fp&&!head0)
dp[len][t]=ans;
return ans;
}
ll cal(ll t)
{
int num=;
memset(dp,-,sizeof(dp));
while(t)
{
dig[++num]=t%;
t/=;
}
return dfs(num,,,);
}
int main()
{
int T;
scanf("%d",&T);
int Case=;
while(T--)
{
ll n,m;
scanf("%lld %lld",&n,&m);
printf("Case %d: ",++Case);
printf("%lld\n",cal(m)-cal(n-));
}
return ;
}

数位dp(D - How Many Zeroes? LightOJ - 1140 )的更多相关文章

  1. How Many Zeroes? LightOJ - 1140

    #include<stdio.h> #include<string.h> #include<math.h> #include<time.h> #incl ...

  2. [暑假集训--数位dp]LightOJ1140 How Many Zeroes?

    Jimmy writes down the decimal representations of all natural numbers between and including m and n, ...

  3. LightOJ 1140: How Many Zeroes? (数位DP)

    当前数位DP还不理解的点: 1:出口用i==0的方式 2:如何省略状态d(就是枚举下一个数的那个状态.当然枚举还是要的,怎么把空间省了) 总结: 1:此类DP,考虑转移的时候,应当同时考虑查询时候的情 ...

  4. LightOJ 1140 How Many Zeroes? (数位DP)

    题意:统计在给定区间内0的数量. 析:数位DP,dp[i][j] 表示前 i 位 有 j 个0,注意前导0. 代码如下: #pragma comment(linker, "/STACK:10 ...

  5. LightOJ 1140 计数/数位DP 入门

    题意: 给出a,b求区间a,b内写下过多少个零 题解:计数问题一般都会牵扯到数位DP,DP我写的少,这道当作入门了,DFS写法有固定的模板可套用 dp[p][count] 代表在p位 且前面出现过co ...

  6. UVALive - 6575 Odd and Even Zeroes 数位dp+找规律

    题目链接: http://acm.hust.edu.cn/vjudge/problem/48419 Odd and Even Zeroes Time Limit: 3000MS 问题描述 In mat ...

  7. LightOJ 1032 - Fast Bit Calculations 数位DP

    http://www.lightoj.com/volume_showproblem.php?problem=1032 题意:问1~N二进制下连续两个1的个数 思路:数位DP,dp[i][j][k]代表 ...

  8. LightOJ 1068 Investigation (数位dp)

    problem=1068">http://www.lightoj.com/volume_showproblem.php?problem=1068 求出区间[A,B]内能被K整除且各位数 ...

  9. lightoj 1021 - Painful Bases(数位dp+状压)

    题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1021 题解:简单的数位dp由于总共就只有16个存储一下状态就行了.求各种进制能 ...

随机推荐

  1. Linux内核分析——第六周学习笔记20135308

    第六周 进程的描述和进程的创建 一.进程描述符task_struct数据结构 1.操作系统三大功能 进程管理 内存管理 文件系统 2.进程控制块PCB——task_struct 也叫进程描述符,为了管 ...

  2. 《Linux内核》课本读书笔记 第三章

  3. order by null 的作用

    在SQL中order by null有什么用吗?这是我在一次面试时面试官问我的问题,当时我是懵的.他让我猜一下,我说不排序?没想到被我猜对了 不排序你就别用order by啊!为什么要用order b ...

  4. PGSQL 数据库备份练习

    截图先 慢慢说 1. 简单使用方法 先用 之前的setx 命令设置环境变量. set path=%PATH% ---其实第一步没必要..... 跟人学的 setx PATH "%path%& ...

  5. MacOS 如何剪切文件

    MacOS 如何剪切文件 MacOS 剪切文件 command + C 复制 command + V 粘贴 删除 & 粘贴 在 Windows中 Ctrl + X 是剪切,MacOS中没有剪切 ...

  6. Java之可变参数方法使用说明

    代码: package test_demo; /* * 可变参数函数说明 * 传入指定数据类型的数组 * 优先匹配固定长度函数 * */ public class VarArgsDemo { // 可 ...

  7. Java之数据流-复制二进制文件

    package test_demo.fileoper; import java.io.*; /* * 数值字节流操作,复制二进制文件 * 输入流:从文件中读取数据,扩展为数据流(二进制) * 输出流: ...

  8. 用宏实现C/C++从非零整数开始的数组

    相信大家在刚学习C/C++时,都会对数组下标从0开始编号有疑惑.尽管我是喜欢从0开始编号的“0党”,但是也有很多的人是喜欢从1开始编号. 意识到C/C++数组与指针具有一定的相似性后,我开始构思如何仿 ...

  9. 32个Python爬虫实战项目,满足你的项目慌

    爬虫项目名称及简介 一些项目名称涉及企业名词,小编用拼写代替 1.[WechatSogou]- weixin公众号爬虫.基于weixin公众号爬虫接口,可以扩展成其他搜索引擎的爬虫,返回结果是列表,每 ...

  10. BZOJ 4540 [Hnoi2016]序列 | 莫队 详细题解

    传送门 BZOJ 4540 题解 --怎么说呢--本来想写线段树+矩阵乘法的-- --但是嘛--yali的机房太热了--困--写不出来-- 于是弃疗,写起了莫队.(但是我连莫队都想不出来!) 首先用单 ...