Light OJ 1140
数位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的更多相关文章
- light oj 1140 - How Many Zeroes? 数位DP
思路:dp[i][j]:表示第i位数,j表示是否有0. 代码如下: #include<iostream> #include<stdio.h> #include<algor ...
- Light oj 1140 How Many Zeroes?
Jimmy writes down the decimal representations of all natural numbers between and including m and n, ...
- Light OJ 1114 Easily Readable 字典树
题目来源:Light OJ 1114 Easily Readable 题意:求一个句子有多少种组成方案 仅仅要满足每一个单词的首尾字符一样 中间顺序能够变化 思路:每一个单词除了首尾 中间的字符排序 ...
- Light OJ 1429 Assassin`s Creed (II) BFS+缩点+最小路径覆盖
题目来源:Light OJ 1429 Assassin`s Creed (II) 题意:最少几个人走全然图 能够反复走 有向图 思路:假设是DAG图而且每一个点不能反复走 那么就是裸的最小路径覆盖 如 ...
- Light OJ 1406 Assassin`s Creed 减少国家DP+支撑点甚至通缩+最小路径覆盖
标题来源:problem=1406">Light OJ 1406 Assassin`s Creed 意甲冠军:向图 派出最少的人经过全部的城市 而且每一个人不能走别人走过的地方 思路: ...
- Light OJ 1316 A Wedding Party 最短路+状态压缩DP
题目来源:Light OJ 1316 1316 - A Wedding Party 题意:和HDU 4284 差点儿相同 有一些商店 从起点到终点在走过尽量多商店的情况下求最短路 思路:首先预处理每两 ...
- light oj 1007 Mathematically Hard (欧拉函数)
题目地址:light oj 1007 第一发欧拉函数. 欧拉函数重要性质: 设a为N的质因数.若(N % a == 0 && (N / a) % a == 0) 则有E(N)=E(N ...
- Light OJ 1406 Assassin`s Creed 状态压缩DP+强连通缩点+最小路径覆盖
题目来源:Light OJ 1406 Assassin`s Creed 题意:有向图 派出最少的人经过全部的城市 而且每一个人不能走别人走过的地方 思路:最少的的人能够走全然图 明显是最小路径覆盖问题 ...
- Light OJ 1288 Subsets Forming Perfect Squares 高斯消元求矩阵的秩
题目来源:Light OJ 1288 Subsets Forming Perfect Squares 题意:给你n个数 选出一些数 他们的乘积是全然平方数 求有多少种方案 思路:每一个数分解因子 每隔 ...
随机推荐
- Python开发【第十八篇】:MySQL(二)
视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,并可以将其当作表来使用. SELECT * FROM ( SEL ...
- Quartz.Net 基于XML配置启动
1.App.config <configSections> <section name="quartz" type="System.Configurat ...
- 导入excel错误:外部表不是预期的格式 解决方案
环境:win7+iis7+Office2007 在asp.net网站中导出Excel文件后,再把文件导入到数据库中. 读取Excel文件时,打开连接出错. 错误为:外部表不是预期的格式 解决:检查了一 ...
- 如何运行python
如何运行Python程序 不少新手朋友遇到的第一个问题,不是Python的数据结构,不是Python的类库使用,更不是第三方模块.框架的应用,而是简单的“如何运行”!Python可用以下三种方式运行, ...
- 性能:15个JavaScript本地存储技术的函数库和工具
当构建更复杂的JavaScript应用程序运行在用户的浏览器是非常有用的,它可以在浏览器中存储信息,这样的信息可以被共享在不同的页面,浏览会话. 在最近的过去,这将有可能只被cookies文本文件保存 ...
- ngCordova插件安装使用
为什么ngCordova ngCordova是在Cordova Api基础上封装的一系列开源的AngularJs服务和扩展,让开发者可以方便的在HybridApp开发中调用设备能力,即可以在Angul ...
- 基于iSCSI的SQL Server 2012群集测试(二)--SQL群集安装后初始化配置测试
4.群集安装后初始化配置测试 4.1 禁用full-text 服务和Browser服务 Full-text服务:公司目前暂不使用,需在两个节点上分别禁用 Browser服务:为保证安全,建议将Brow ...
- 通过url地址传递base64加密参数遇到的问题整理
1. base64的加密解密方法在C#的类库中就有 QueryString中的加号变成了空格问题 Server.UrlEncode(username),获取到的编码又将等于号变成了%3d; 到底改怎么 ...
- php 通过curl post发送json数据实例
例1 代码如下 复制代码 $data = array("name" => "Hagrid", "age" => "3 ...
- windows下调用外部exe程序 SHELLEXECUTEINFO
本文主要介绍两种在windows下调用外部exe程序的方法: 1.使用SHELLEXECUTEINFO 和 ShellExecuteEx SHELLEXECUTEINFO 结构体的定义如下: type ...