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内置函数每个执行一次
open # with open('log','r') as f: 或者 r=open(filename,r+) with open ('1.txt','r',encoding ...
- 小技能——markdown
如果常常要在电脑上写点东西,比如写笔记.做总结.写博客之类的,花一两个小时学会markdown还是很值的. markdown简介 markdown不是某个软件,而是一种标记语言,标记普通文本的格式,以 ...
- yaf扩展
- Java 中浮点数---------BigDecimal和double(初探)
为什么要使用 bigdecimal? 借用<Effactive Java>这本书中的话,float和double类型的主要设计目标是为了科学计算和工程计算.他们执行二进制浮点运算,这是为了 ...
- dubbo框架----初探索-配置
使用框架版本 dubbo-2.5.3 spring-4.2.1.RELEASE jdk-1.8 tomcat-8.0 zookeeper-3.3.6 Dubbo与Zookeeper.SpringMVC ...
- [译]ngclass expressions in angularjs
原文: http://blog.xebia.com/2014/01/31/ngclass-expressions-in-angularjs/ ngClass 指令允许你通过databinding一个表 ...
- EF-在EF中运行sql语句
DbRawSqlQuery<int> result2 = db.Database.SqlQuery<int>("SELECT count(*) FROM test.s ...
- runtime(面试)
运行时机制,runtime库里面包含了跟类.成员变量.方法相关的API,比如获取类里面的所有成员变量,为类动态添加成员变量,动态改变类的方法实现,为类动态添加新的方法等 需要导入<objc/me ...
- Request.ServerVariables 参数大全
Request.ServerVariables("Url") 返回服务器地址 Request.ServerVariables("Path_Info") 客户端提 ...
- hash-5.ConcurrentHashMap
http://www.cnblogs.com/dolphin0520/p/3932905.html有时间细看