Light OJ 1140

时间:2022-09-11 15:10:17

数位dp,需要记录前导0。

数位dp中需要注意统计0,00,000……这些数字。

数位dp的写法可以分为两类。由于我们通常采用记忆化搜索的方式进行dp,所以我们有一个记忆化数组。

一种是记忆化数组的意义是不通用的,对于不同case,该数组的值不同。另一种是通用的,不同case,数组的值不变。

对于第一种情况的实现比较简单,只需要將递归过程的全部参数记录在数组的维度中。

由于要记录全部的参数,数组维度高,所以空间效率低。

由于不同case要重新计算记忆化数组,所以对于多case的评判时间效率低。

模板如下:

long long dfs(int digit, bool less, bool leading_zero, ...)
{
if (digit < )
{
return ...;
}
if (memoize[digit][less][leading_zero][...] != -)
{
return memoize[digit][less][leading_zero][...];
}
int limit = less ? : f[digit];
long long ret = ;
for (int i = ; i <= limit; i++)
{
ret += dfs(digit - , less || i < f[digit], leading_zero && i==, ...);
}
return memoize[digit][less][leading_zero][...] = ret;
}

对于第二种情况,则需要对某些参数进行条件判断,记忆化数组memoize[digit]中记录的是,最低的digit位可以任意取值的情况下,我们所需要的答案。

因而,这种记忆化数组自然不会受到上界的限制。

但是实现起来复杂,如果需要条件判断的变量(在递归参数中,却不在记忆化数组中的变量)过多,则会尤为复杂。

尤其是对于那种多个数字,每个数字都有上界,同时进行dp的情况,不应该使用这种方法,而应选用第一种方法。

模板如下:

long long dfs(int digit, bool less, bool leading_zero, ...)
{
if (digit < )
{
return ...;
}
if (less && !leading_zero && memoize[digit][...] != -)
{
return memoize[digit][...];
}
int limit = less ? : f[digit];
long long ret = ;
for (int i = ; i <= limit; i++)
{
ret += dfs(digit - , less || i < f[digit], leading_zero && i == , ...);
}
if (less && !leading_zero)
{
memoize[digit][...] = ret;
}
return ret;
}

本题答案如下:

#include <cstdio>
#include <cstring>
using namespace std; const int MAX_DIGIT = ; long long n;
int f[MAX_DIGIT];
long long memoize[MAX_DIGIT][**];
int pivot; int to_digits(long long a)
{
int ret = ;
while (a > )
{
f[ret++] = a % ;
a /= ;
}
return ret;
} long long dfs(int digit, bool less, bool leading_zero, int zero_num)
{
if (digit < )
{
return zero_num;
}
if (less && !leading_zero && memoize[digit][zero_num] != -)
{
return memoize[digit][zero_num];
}
int limit = less ? : f[digit];
long long ret = ;
for (int i = ; i <= limit; i++)
{
int delta = !leading_zero && i == ? : ;
ret += dfs(digit - , less || i < f[digit], leading_zero && i == , zero_num + delta);
}
if (less && !leading_zero)
{
memoize[digit][zero_num] = ret;
}
return ret;
} long long work(long long n)
{
if (n < )
{
return ;
}
if (n == )
{
return ;
}
int len = to_digits(n);
return dfs(len - , false, true, ) + ;
} int main()
{
int t;
scanf("%d", &t);
memset(memoize, -, sizeof(memoize));
for (int i = ; i <= t; i++)
{
long long a, b;
scanf("%lld%lld", &a, &b);
printf("Case %d: %lld\n", i, work(b) - work(a - ));
}
return ;
}

Light OJ 1140的更多相关文章

  1. light oj 1140 - How Many Zeroes&quest; 数位DP

    思路:dp[i][j]:表示第i位数,j表示是否有0. 代码如下: #include<iostream> #include<stdio.h> #include<algor ...

  2. Light oj 1140 How Many Zeroes&quest;

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

  3. Light OJ 1114 Easily Readable 字典树

    题目来源:Light OJ 1114 Easily Readable 题意:求一个句子有多少种组成方案 仅仅要满足每一个单词的首尾字符一样 中间顺序能够变化 思路:每一个单词除了首尾 中间的字符排序 ...

  4. Light OJ 1429 Assassin&grave;s Creed &lpar;II&rpar; BFS&plus;缩点&plus;最小路径覆盖

    题目来源:Light OJ 1429 Assassin`s Creed (II) 题意:最少几个人走全然图 能够反复走 有向图 思路:假设是DAG图而且每一个点不能反复走 那么就是裸的最小路径覆盖 如 ...

  5. Light OJ 1406 Assassin&grave;s Creed 减少国家DP&plus;支撑点甚至通缩&plus;最小路径覆盖

    标题来源:problem=1406">Light OJ 1406 Assassin`s Creed 意甲冠军:向图 派出最少的人经过全部的城市 而且每一个人不能走别人走过的地方 思路: ...

  6. Light OJ 1316 A Wedding Party 最短路&plus;状态压缩DP

    题目来源:Light OJ 1316 1316 - A Wedding Party 题意:和HDU 4284 差点儿相同 有一些商店 从起点到终点在走过尽量多商店的情况下求最短路 思路:首先预处理每两 ...

  7. light oj 1007 Mathematically Hard &lpar;欧拉函数&rpar;

    题目地址:light oj 1007 第一发欧拉函数. 欧拉函数重要性质: 设a为N的质因数.若(N % a == 0 && (N / a) % a == 0) 则有E(N)=E(N ...

  8. Light OJ 1406 Assassin&grave;s Creed 状态压缩DP&plus;强连通缩点&plus;最小路径覆盖

    题目来源:Light OJ 1406 Assassin`s Creed 题意:有向图 派出最少的人经过全部的城市 而且每一个人不能走别人走过的地方 思路:最少的的人能够走全然图 明显是最小路径覆盖问题 ...

  9. Light OJ 1288 Subsets Forming Perfect Squares 高斯消元求矩阵的秩

    题目来源:Light OJ 1288 Subsets Forming Perfect Squares 题意:给你n个数 选出一些数 他们的乘积是全然平方数 求有多少种方案 思路:每一个数分解因子 每隔 ...

随机推荐

  1. Android开源项目&lpar;二&rpar;

    第二部分 工具库 主要包括那些不错的开发库,包括依赖注入框架.图片缓存.网络相关.数据库ORM建模.Android公共库.Android 高版本向低版本兼容.多媒体相关及其他. 一.依赖注入DI 通过 ...

  2. &lbrack;CareerCup&rsqb; 13&period;5 Volatile Keyword 关键字volatile

    13.5 What is the significance of the keyword "volatile" in C 这道题考察我们对于关键字volatile的理解,顾名思义, ...

  3. mac提升yosemite后php 扩展修复

    mac升级之后 php 正积极提升自己,导致php环境破坏 所以 例如有以下几点需要修复 1. sudo ln -s /Applications/Xcode.app/Contents/Develope ...

  4. 安卓笔记-可以滚动的TextView

    本来是想做一个显示文字信息的,当文字很多时View的高度不能超过一个固定的值,当文字很少时View的高度小于那个固定值时,按View的高度显示.因为ScrollView没有maxHeight,无法满足 ...

  5. 使用VirtualBox调试项目踩过的坑

    当我们完成项目后 通常需要做其他系统的测试 例如win10下测试完成后要在win7中测试 这时,安装一个虚拟机是较为明智的选择 本文将讲述在使用虚拟机测试Unity发布的exe(所有的3D文件都适用) ...

  6. Spring类型转换(Converter)

    Spring的类型转换 以前在面试中就有被问到关于spring数据绑定方面的问题,当时对它一直只是朦朦胧胧的概念,最近稍微闲下来有时间看了一下其中数据转换相关的内容,把相应的内容做个记录. 下面先说明 ...

  7. 解决秒杀活动高并发出现负库存(Redis)

    商城在秒杀活动开始时,同时有好多人来请求这个接口,即便做了判断库存逻辑,也难免防止库存出现超卖,造成损失 Django中的ORM本身就对数据库做了防范,但再过亿级访问也扛不住 下面利用Redis的过载 ...

  8. &lpar;转&rpar;Maven pom&period;xml 配置详解

    背景:maven一直感觉既熟悉又陌生,归根结底还是自己不太熟. 1 什么是pom? pom作为项目对象模型.通过xml表示maven项目,使用pom.xml来实现.主要描述了项目:包括配置文件:开发者 ...

  9. MySQL 之数据库增量数据恢复案例

    MySQL 数据库增量数据恢复案例 一.场景概述 MySQL数据库每日零点自动全备 某天上午10点,小明莫名其妙地drop了一个数据库 我们需要通过全备的数据文件,以及增量的binlog文件进行数据恢 ...

  10. ComputeSignature 中行支付签名报错(win7 64位系统)

    在做中行加密验签的时候出现的问题.原本在XP系统下可以正常运行的,现在换了win7 64位系统就出现了这个问题,没头绪 所以发上来求各位大大支招 有什么好的解决方案.. 我的解决办法: 1.C:\Do ...