【数位DP】题集
1.【HDOJ2089】
题意:求区间内不出现4和62的数的个数
解法:模板题
2.【HDOJ3555】
题意:求区间内不出现49的数的个数
解法:模板题
3.【HDOJ5179】
题意:对于一个十进制数,把每一位拆出来变成一个数组,要求数组右边的数都小于等于左边的数,且左数能整除右数。求区间内满足条件的个数
解法:dp[i = 20][j = 10]
: j为前一位上的数
按要求转移即可,要考虑前导零,注意防止%0的情况出现
4.【HDOJ3652】
题意:求区间内含13或者是13倍数的数的个数
解法:dp[i = 20][j = 13][k = 3]
: j为对13的余数,k为状态(0: 前一位不是1 | 1: 前一位是1 | 2: 前面出现过13)
最后当j为0,k为2时加入计数,计算不含13并且不是13倍数的数
输出时为N + 1 - solve(N)
(0也在统计内)
5.【HDOJ3709】
题意:定义平衡数,以某一数位作为原点,左边数位上数字 × 距离
之和与右边数位上的相等。求区间内平衡数的个数
解法:dp[i = 20][j = 5000][k = 20]
: j为左边数位权值之和,k为枚举的原点
需要枚举原点,然后统计左边权值的减去右边的权值最后是否为零,由于 0 对于每个枚举位置都会被统计,最后要再减去枚举次数 - 1
个重复的0
6.【HDOJ6148】
题意:对于一个十进制数,要求从左到右的数位没有出现先递增接着递减的情况,求区间内满足条件的个数
解法:dp[i = 105][j = 10][k = 2]
: j为前一个数,k表示前面是否已出现递增
按要求转移即可,要考虑前导零,这题的0是不合法的,额外减1就行了,注意数据范围10^100
7.【HDOJ5898】
题意:对于一个十进制数,要求数位中奇数段长度都为偶数,偶数段长度都为奇数,求区间内满足条件的个数
解法:dp[i = 20][j = 10][k = 20]
: j为前一个数,k为前一个数所属段的长度
要考虑前导零,转移时,当前数位若与前一位奇偶相反,表示前一段已结束,判断长度是否满足要求剪枝,并重置k为1继续向下枚举,最后统计时还要再判断一次j与k,奇偶相反则加入统计
8.【HDOJ4734】
题意:定义:F(x) = An * 2^n-1 + An-1 * 2^n-2 + ... + A2 * 2 + A1 * 1
,Ai是十进制数位,求区间内满足F(i)<=F(a)的i的个数
解法:dp[i = 20][j = 20000]
: j表示枚举到当前位时,在满足条件情况下后面的数位还能有多少权值(初始值为F(a))
最后当j >= 0加入计数,中间状态若j已经小于0则可剪枝
9.【HDOJ4352】
题意:求区间内数位从左到右满足LIS = m的数的个数
解法:dp[i = 20][j = 1 << 10][k = 11]
: j状态压缩表示当前LIS状态,k表示所求LIS长度(不加k会导致每组数组要重新初始化,超时)
要考虑前导零,在数位上跑nlogn的LIS
int updateState(int state, int digit) {
// i=digit严格递增,状态压缩无法计算不减递增
for (int i = digit; i <= 9; i++) {
if (state & (1 << i)) {
state ^= (1 << i);
break;
}
}
return state | (1 << digit);
}
int getLIS(int state) {
int cnt = 0;
while (state) {
if (state & 1) {
cnt++;
}
state >>= 1;
}
return cnt;
}
10.【HDOJ4507】
题意:求区间内和7无关的数字的平方和,结果对1e9+7取模
解法:dp[i = 20][j = 7][k = 7]
: j表示整个数%7的余数,k表示数位和%7的余数
要求的是所有满足条件的数的平方和,要对一个数按照平方和公式拆分。
假设满足条件的数有234, 245, 266
,那么
234^2 + 245^2 + 266^2 =
(200 + 34)^2 + (200 + 45)^2 + (200 + 66)^2 =
3 * 200^2 + 2 * 200 * (34 + 45 + 66) + (34^2 + 35^2 + 66^2)
因此在枚举到2的时候,表达式里未知的只有
3, (34 + 45 + 66), (34^2 + 35^2 + 66^2)
结构体数组dp中记录三个值,cnt代表满足条件的数的个数,sum表示满足条件的数的求和,sum2表示满足条件的数的平方和
不带取模的转移方程:
ans.cnt += tmp.cnt
ans.sum += (tmp.sum + tmp.cnt * (i * p[pos]))
ans.sum2 += (tmp.cnt * (i * p[pos])^2 + 2 * (i * p[i]) * tmp.sum + tmp.sum2)
为了防止出现负数,输出要(solve(r) - solve(l - 1) + mod) % mod
11.【POJ3252】
题意:求区间内满足二进制下0的数位 >= 1的数位的数的个数
解法:dp[i = 32][j = 32][k = 32]
: j表示0的个数,k表示1的个数
要考虑前导零,按照题意转移即可,注意j + len - pos < k
时可剪枝
12.【HDOJ3886】
题意:给出一个字符串,只含/, -, \
,要求一个数上的数位按相应字符上升、不变或下降(如12345554321
符合/-\
),求区间内满足条件的数的个数,输出时保留最后八位
解法:dp[i = 105][j = 10][k = 105]
: j表示前一个数,k表示匹配到字符串哪个位置
要注意的点比较多:
① 输入数据可能有前导零,范围10^100
② 字符串数据的大整数减法(L - 1
)
③ 输出时保留最后八位,即对1e8取模,同时按照指定格式输出
printf("%08lld\n",(solve(r) - solve(l) + mod) % mod);
④ 对每组数据都要初始化dp,因为要匹配的字符串变了
⑤ 枚举时要考虑前导零,只能在无前导零状态时进行匹配
⑥ 当能匹配下一个字符时,尽量先匹配,如果不能再判断是否符合之前的字符
【数位DP】题集的更多相关文章
- 数位dp题集
题集见大佬博客 不要62 入门题,检验刚才自己有没有看懂 注意一些细节. 的确挺套路的 #include<bits/stdc++.h> #define REP(i, a, b) for(r ...
- (计数器)NOIP模拟赛(神奇的数位DP题。。)
没有原题传送门.. 手打原题QAQ [问题描述] 一本书的页数为N,页码从1开始编起,请你求出全部页码中,用了多少个0,1,2,…,9.其中—个页码不含多余的0,如N=1234时第5页不是00 ...
- 杭电dp题集,附链接还有解题报告!!!!!
Robberies 点击打开链接 背包;第一次做的时候把概率当做背包(放大100000倍化为整数):在此范围内最多能抢多少钱 最脑残的是把总的概率以为是抢N家银行的概率之和- 把状态转移方程写成了f ...
- DP 题集 2
关于 DP 的一些题目 String painter 先区间 DP,\(dp[l][r]\) 表示把一个空串涂成 \(t[l,r]\) 这个子串的最小花费.再考虑 \(s\) 字符串,\(f[i]\) ...
- DP 题集 1
关于 DP 的一些题目 参考资料 [Tutorial] Non-trivial DP Tricks and Techniques DP Rain and Umbrellas Mr. Kitayuta, ...
- 浅谈数位DP
在了解数位dp之前,先来看一个问题: 例1.求a~b中不包含49的数的个数. 0 < a.b < 2*10^9 注意到n的数据范围非常大,暴力求解是不可能的,考虑dp,如果直接记录下数字, ...
- HDU 3709 Balanced Number (数位DP)
Balanced Number Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others) ...
- 数位DP之小小结
资料链接:http://wenku.baidu.com/view/9de41d51168884868662d623.html http://wenku.baidu.com/view/d2414ffe0 ...
- HDU5787 K-wolf Number 数位dp
分析:赛场上也知道是裸的数位dp,但是无奈刷数位dp题刷的太少了,并不能写出来 一点感想:赛后补题,看了题解的map记录状态,一脸蒙逼,也是非常的不爽,然后想看别人写的,不是递归就是写的比较乱 而且我 ...
- ural 1057(数位dp)
数位dp题,关键是用树的思维去考虑. 对于一个数字X,要是能表示成K个B的不同次幂,等价于X在B进制下有且只有K个位上面的数字为一,其他位上的数字都为0. 具体读者可以去参考,国家集训队李聪的论文,里 ...
随机推荐
- 使用jQuery实现向上循环滚动效果(超简单)
今天突发奇想 想到的一个新思路 通过使用animate改变外边距达到滚动效果 再用复制节点插入到最后一行达到循环目的 HTML代码如下 <body> <ul style=" ...
- tomcat安装、配置相关的几个点
Connector port="8080"HTTP协议的默认端口号:8080 FTP协议的默认端口号:21 1.tomcat的安装目录要与Java jre的安装目录一致. bin: ...
- Android中,子线程使用主线程中的组件出现问题的解决方法
Android中,主线程中的组件,不能被子线程调用,否则就会出现异常. 这里所使用的方法就是利用Handler类中的Callback(),接受线程中的Message类发来的消息,然后把所要在线程中执行 ...
- spring-构建mvc工程
SpringMVC基于模型-视图-控制器(MVC)模式实现,可以构建松耦合的web应用程序. 1.SpringMVC的请求过程 1)请求离开浏览器,并携带用户所请求的内容 2)DispatcherSe ...
- thinkphp5访问sql2000数据库
大家都知道php跟mysql是绝配,但是因为有时候工作需要,要求php访问操作sql2000,怎么办呢? 一般来说有两种方式: 1. sqlsrv驱动方式 2. odbc方式 sqlsrv驱动方式,因 ...
- QWebView 与Js 交互
我本愚钝,在网上搜了一下没找到可以运行的栗子,遂在这记录一下吧. 环境:win10 64位系统 qt 4.8.7 (mingw32) qtcreator(4.5.0) 1. 建立一个 Widgets ...
- sublime解决gbk中文乱码包括Package Control: Install Package 无法使用
最近喜欢上了sublime,打算抛弃notepad,但是发现sublime居然不支持gbk编码,再上网查找资料之后,总结了一套解决方法,目前为止是行之有效的. 日期:2019年3月14日 第一步:到G ...
- (数据科学学习手札45)Scala基础知识
一.简介 由于Spark主要是由Scala编写的,虽然Python和R也各自有对Spark的支撑包,但支持程度远不及Scala,所以要想更好的学习Spark,就必须熟练掌握Scala编程语言,Scal ...
- 【8086汇编-Day5】第二次实验
debug的使用 偷个懒,之前写过了这里不再赘述 实验 1)实验1 要求:用e将一些数据写入内存,用a写入一段程序,t 逐条执行 观察具体参数变化,并探究现象 1.e写入,d检查 2.a写入程序 3. ...
- vue中开发webSocket
先安装 sockjs-client 和 stompjs npm install sockjs-client npm install stompjs <template> <div&g ...