入门题 : [Luogu1441]砝码称重 , [NOIP2015]子串

[AHOI2009]中国象棋 , 详见代码

[HNOI2007]梦幻岛宝珠 , 详见代码

[NOIP2012]开车旅行 , 没有代码...

预处理出\(ga[i] , gb[i]\)代表从城市\(i\)出发\(A\)或\(B\)走一步会到达的城市
设\(f[i][j][k]\)表示从城市\(j\)出发 , 两人共驾驶\(2^i\)天 , \(k\)先开车 , 最终会到达的城市
设\(da[i][j][k]\)表示从城市\(j\)出发 , 两人共驾驶\(2^i\)天 , \(k\)先开车 , 小\(A\)的行驶路程总长度
设\(db[i][j][k]\)表示从城市\(j\)出发 , 两人共驾驶\(2^i\)天 , \(k\)先开车 , 小\(B\)的行驶路程总长度

注意转移是有\(f[1][j][k]\)的情况 , 此时由于天数\(2^0\)是奇数 , 前后开车的人不一样 ; \(i>1\)以后开车的人就一样了.
设\(calc(s,x)\)表示计算从\(s\)城市出发最多走\(x\)公里A和B分别行驶了多长路程.
这三个状态都可以做到\(O(n\log n)\)预处理 , 只有一个\(1\)询问 , 就直接对每一个点都求一次求最小值 ; 对于\(2\)询问就直接\(alc(s,x)\)

倍增\(DP\)基础 : [Luogu5151]HKE与他的小朋友 , 题解是这样说的 , 我的解释
还有这个 : [Luogu1613]跑路

每个状态都有一个对应的后继状态 , 这样的题可以用倍增处理 .
一开始觉得这道题非常不可做 , 因为它的转移一定是要枚举的 , 学到后面才发现很多东西都可以预处理出来 , \(DP\)也就是这个道理
而\(DP\)对状态的最优化就是倍增了 .

[NOIP2015]斗地主 , 详见代码

神仙贪心 ,优秀的DP

设\(dp[i][j][k][l][z]\)为有\(i\)种\(1\)张牌 , \(j\)种 2 张牌 , \(k\)种\(3\)张牌 , \(l\)种\(4\)张牌 , \(z\)张王的出牌次数

写出各种转移方程 , 注意循环的次序 , 等式右边一定要比左边先循环到

[NOI2009]管道取珠 , 详见代码

方案数的平方和转化为选两次结果一样的方案数

设\(f[i][j][k]\)表示第\(1\)种方案第一行选了\(i\)个 , 第二行选了\(j\)个
第二种方案第一行选了\(k\)个 , 第二行选了\(i+j-k\)个 , 两次取出的球一样的方案数

[JXOI2018]游戏

首先计算出\(l\)到\(r\)中,不是任何数的倍数的有多少个,记这个值为\(sum\)。比如说\(l=4,r=8\)时,\(4,5,6,7\)都不是任何数的倍数,此时\(sum=4\)。我们称这样的数为“关键数”

不难发现,\(t(p)\)的定义,其实就是排列\(p\)中,最后一个关键数的位置

于是我们可以枚举最后一个关键数的位置\(i\),在它后面不能存在关键数,所以它后面的元素有\(C(n-sum,n-i)\)种选取方法,对于每种选取方案,\(i\)后面的元素有\((n-i)!\)种排列方式,\(i\)前面的元素有\((i-1)!\)种排列方式,然后\(i\)这个位置可以是\(sum\)个关键数中的任意一个,并且这个位置对答案的贡献为\(i\)
于是答案可以表达成下式:

$\sum\limits_{i=1}^ni\times sum\times \binom{n-sum}{n-i}\times(n-i)!\times(i-1)! $

直接预处理阶乘及其逆元即可,\(sum\)直接埃氏筛\(O(n*l_nn)\)暴算即可

关于倍数的题目,枚举最小的"关键数"是很巧妙的套路.

[FJOI2016]建筑师

注意到建筑高度不同且取满\([1,n]\)
把所有的建筑分成 \(A+B-1\) 个部分 , \(n\)是最高点 , 把除了 \(n\) 以外的 \(n-1\)个建筑放到 \(A+B-2\)个圆桌上
相当于从高往低插入 , 可以选择独占一桌 , 即形成一个高峰 ; 或者补充到某一桌(块)某一人(楼)旁边 , 也就不会被看到
然后\(A+B-2\)个部分要选出\(A-1\)个放在左边 , \(B-1\)个放在右边

[51Nod1376] 最长递增子序列的数量 , 这个是完全看代码

树状数组也可以维护两个值 : 最大值和方案数

[USACO19FEB]Moorio Kart , 详见代码

即\(O(n^2)\)暴力统计出每个森林的路径 , 从\(ctgn\)个集合中各选出一个数 , 使得长度\(>=Y\)的方案数 .

用背包统计 . 具体实现 :
\(dp[i+j][0]\leftarrow dp[i][0]*g[j][0]\)
\(dp[i+j][1]\leftarrow dp[i][0]*g[j][1] + dp[i][1]*g[j][0]\)

数据范围\((n^2)\)能做的事 : 以每个点为根遍历一遍算答案 . 正确性 : 以每一个点为一个端点来统计

[ZJOI2008]生日聚会 , 详见代码

有\(n\)个男孩和\(m\)个女孩坐成一排,求任意一段区间内男孩和女孩的数量之差不超过\(K\)的方案数.

\(f[i][j][x][y]\)应该是前\(i\)个人中有\(j\)个是男生,以当前点为结尾的任意一段不超过\(k\)的区间男生比女生最多多\(x\)人,女生比男生最多多\(y\)人的方案数

设状态的时候注意,这一题中两维的状态根本无法描述全部情况,至少开第三维,然而还是不能解决问题,考虑到数据范围很小,就开到了第四维.

采用刷表法更方便.\(f[0][0][0][0]=1.\)

这样搞可以保证转移的合法性,最终统计答案的时候就直接把使用的\(f[n+m][m][i][j]\)加起来就可以了.

[HAOI2018]奇怪的背包 , 详见代码

设 \(F[i][j]\) 表示选到 \(P\) 的第 \(i\) 个约数,选出的数的 \(gcd\) 值为 \(P\) 的第 \(j\) 个约数的方案数
则有 \(F[i][j]=F[i−1][j]+(1+∑_{gcd(a[k],a[i])==a[j]}F[i−1][k])∗(2^{s[i]−1})\)
其中 \(a[i]\) 表示 \(P\) 的第 \(i\) 个约数, \(s[i]\) 表示第 \(i\) 个约数的出现次数
分别对应继承上一轮 , 转移 , 只选这一种的情况

对于每一个询问 \(w_{i}\)我们容易得出答案就是 \(\sum{_{a[i]|w_{i}}F[n][i]}\)
事实上我们可以发现,如果一个数既是 \(P\) 的约数,又是 \(w_{i}\)的约数,那么它一定是 \(gcd(P,w_{i})\)约数,
因此我们只需要统计 \(\sum{_{a[i]|gcd(P,w_{i})}F[n][i]}\)
而这可以在DP之后就预处理出来 : \(G[i]=\sum{_{a[j]|a[i]}F[n][j]}\)

[JSOI2018]机器人 , 详见代码

关于这道题的找规律 : 首先对于这种循环或者矩形上的操作可以先考虑正方形 ,
发现对于\(3*3\)的正方形一定是横竖分别走1步和2步才能回到原点 ;但这太小了
对于\(5*5\)的正方形除了\(1\)步和\(4\)步还有\(2\)步和\(3\)步 , 而\(4*4\)的正方形却不能是\(2\)步和\(2\)步
猜一个结论 : 必须是互质的 , 否则不兼容; 更细心还可以发现 , 循环的步数还必须是\(n\) ; 不然有些点就会走不到或者提前撞到 , 即不会走满

猜测正方形嵌套到长方形里面会怎么样 , 发现这时每个块里的线的形状都是一样的 .
为什么会这样呢 ? 也许这时正方形的排布也要满足长和宽互质 , 否则不兼容 .
只有互质的 , 才是兼容的 , 才能跑满跑完 .
所以要找到\(d=gcd(n,m)\) , 分成\(d*d\)的正方形去做
而对于循环内的顺序却是不重要的

然后就是\(DP\)了 , \(DP\)也很巧妙
在一组合法的循环方案中 , 设\(fir[x][y]\)表示\((x,y)\)这个点在第几轮会第一次撞到 ,
然后要统计第\(k\)轮撞到\((x,y)\)的方案数 , 考虑这个就可以只用看这个循环的正方形了
可以发现一条路径如果撞上\((x,y)\) , \((x,y)\)之前的经过点都必须满足\(fir[i][j]>fir[x][y]\) , 在\((x,y)\)之后的经过点都必须满足\(fir[i][j]>=fir[x][y]\)
从左上往右下 , 从右下往左上分别做\(DP\)就好了

[JLOI2015]骗我呢 , 详见代码

神仙题只能看神仙题解

\(dp[i][j]\) 表示第 \(i\) 行没有出现过的数是 \(j\) 的方案数

则\(dp[i][j]=∑_{k=0}^{j+1}dp[i−1][k]\)

优化后为\(dp[i][j]=dp[i−1][j+1]+dp[i][j−1]\)

不管怎么样 , 先把好设的状态设出来再说

画图转化为 : 从原点出发,只能向右或向上走,不接触直线\(A,B\),到达点\((n+m+1,n)\)的路径条数

到\((x,y)\)的不合法的方案为先穿过\(A\)或先穿过\(B\)

先穿过\(A\)的实现方式是 : 把\((x,y)\)沿\(A\)翻折 , 减去答案 ; 将翻折过的点沿\(B\)翻着 , 加上答案 ; 再沿A翻折...

同理计算以 \(B\) 开头的方案,就是先沿 \(B\) 折就好了

具体细节的话沿着 \(A\) 折是 \((x,y)->(y-1,x+1)\) ,沿着 \(B\) 折是 \((x,y)->(y+(m+2),x-(m+2))\)

[NOIP2018]填数游戏 , 只会50分\(\dots\)

DP小小结的更多相关文章

  1. 插头$DP$学习小结

    插头\(DP\)学习小结 这种辣鸡毒瘤东西也能叫算法... 很优秀的一个算法. 最基本的适用范围主要是数据范围极小的网格图路径计数问题. 如果是像\(Noi2018\)那种的话建议考生在其他两道题难度 ...

  2. 数位DP之小小结

    资料链接:http://wenku.baidu.com/view/9de41d51168884868662d623.html http://wenku.baidu.com/view/d2414ffe0 ...

  3. hdu 4540 威威猫系列故事——打地鼠 dp小水题

    威威猫系列故事——打地鼠 Time Limit: 300/100 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total ...

  4. 树形动态规划(树状DP)小结

    树状动态规划定义 之所以这样命名树规,是因为树形DP的这一特殊性:没有环,dfs是不会重复,而且具有明显而又严格的层数关系.利用这一特性,我们可以很清晰地根据题目写出一个在树(型结构)上的记忆化搜索的 ...

  5. 数位DP复习小结

    转载请注明原文地址http://www.cnblogs.com/LadyLex/p/8490222.html 之前学数位dp的时候底子没打扎实 虚的要死 这次正好有时间……刷了刷之前没做的题目 感觉自 ...

  6. DP小题集

    P2736 "破锣摇滚"乐队 Raucous Rockers 你刚刚继承了流行的"破锣摇滚"乐队录制的尚未发表的N(1 <= N <= 20)首歌的 ...

  7. 2017.8.12 dp课小结

    这节课难度超级大啊,基本上都是省选+NOI的题. 例1: 1801: [Ahoi2009]chess 中国象棋 Time Limit: 10 Sec  Memory Limit: 64 MB Subm ...

  8. 洛谷 1373 dp 小a和uim之大逃离 良心题解

    洛谷 1373 dp 这题还不算太难,,当初看的时候不是很理解题意,以为他们会选择两条不同的路径,导致整体思路混乱 传送门 其实理解题意和思路之后还是敲了不短的时间,一部分身体原因再加上中午休息不太好 ...

  9. 8.8&8.9 dp训练小结

    写了两天的dp题,表示大多dp都不会啊,还是爆搜大法好.我真的太蒻了dp还是要多做题啊,一些基本的套路还是不熟,真正写对的dp也就一道,还一道爆搜过的,dp还有很深的坑要填啊.. 8.8 T1 质数和 ...

随机推荐

  1. 闲来无事,做做Google:21 道能力倾向测试面试题

    1. Solve this cryptic equation, realizing of course that values for Mand E could be interchanged. No ...

  2. elasticsearch2.x线程池配置

    一个Elasticsearch节点会有多个线程池,但重要的是下面四个: 索引(index):主要是索引数据和删除数据操作(默认是cached类型) 搜索(search):主要是获取,统计和搜索操作(默 ...

  3. mybatis spring 框架整合

    driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/test user=LF password=LF <?xml versi ...

  4. mybatis 框架 的应用之二(批量添加、实现分页查询)

    lf-driver=com.mysql.jdbc.Driver lf-url=jdbc:mysql://localhost:3306/test lf-user=LF lf-password=LF &l ...

  5. 解决在Python中使用Win32api报错的问题,No module named win32api

    一.系统环境 操作系统: Win7 64位 Python:3.7.0 二.在使用import win32api时,报错:No module named win32api 网上查到有下面解决办法: 方法 ...

  6. 面试题:TCP协议三次握手

    一.首先了解TCP报文格式 其中必须了解的字段有: 1.源端口与目的端口:16位,标识出发送端与接收端的端口号. 2.序号:32位,也叫顺序号.seg序号,本报文段所发送的数据的第一个字节的序号,用来 ...

  7. C++之shared_ptr总结

    转自 http://blog.csdn.net/u013696062/article/details/39665247 Share_ptr也是一种智能指针.类比于auto_ptr学习.所以推荐先学习a ...

  8. Unity破解不成功解决方案

    你是不是遇到过Unity新版本出来的时候就急着使用,但是安装好了,却破解不成功的问题(你之前的版本破解过).这是由于你的注册表没有彻底的删除,接下来我们图解如何清理. 1.卸载以前的版本,卸载完了删除 ...

  9. Android Service基本知识总结(一)

    一.简介 Service是Android系统的后台服务组件,适用于开发无界面.长时间运行的应用功能Service特点如下: 没有用户界面 不会轻易被Android系统终止 在系统资源恢复后Servic ...

  10. 使用Oracle(SQL Plus)

    error: connection as sys should be as SYSDBA or SYSOPER 用户名 :sys 密码:  自己设定的database:ORCLconnect as : ...