入门题 : [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. Mongoose 参考手册(转载)

    Mongoose 是什么? 一般我们不直接用MongoDB的函数来操作MongoDB数据库 Mongose就是一套操作MongoDB数据库的接口. Schema 一种以文件形式存储的数据库模型骨架,无 ...

  2. 我的笔记,有关 PhotoShop,给自己的记忆宫殿

    一直有心学习 PhotoShop ,各种教程也 download 了不少,什么祁连山.PS大师之路.Oeasy 等等.看了吗?丫蛋的只看了前面两集!还是在博客上写写坐下笔记,好记性不如烂笔头. 0.先 ...

  3. POI 生成exel报表

    去官网下载相关jar包   http://poi.apache.org/ package poi.zr.com; import java.io.File; import java.io.FileNot ...

  4. Socket接口原理及用C#语言实现

    首先从原理上解释一下采用Socket接口的网络通讯,这里以最常用的C/S模式作为范例,首先,服务端有一个进程(或多个进程)在指定的端口等待客户来连接,服务程序等待客户的连接信息,一旦连接上之后,就可以 ...

  5. SEO网站结构优化

    结构布局优化:用扁平化结构(层次结构超过三层小蜘蛛就不愿意爬了) 控制首页链接数量(中小网站100以内,页面导航.底部导航.锚文字链接等) 扁平化的目录层次(小蜘蛛跳转3次可以到达网站内任何一个内页, ...

  6. Robot Framework - 基础关键字 BuiltIn 库(二)

    本篇教程,我们继续接着上篇内容进行讲解,我们本节教程讲解的是Robot Framework 机器人框架中的变量中使用判断.字符串的拼接.Evaluate的用法.调用Python文件.条件分支语句.以及 ...

  7. CORS同源策略

    同源策略以及跨域资源共享在大部分情况下针对的是Ajax请求.同源策略主要限制了通过XMLHttpRequest实现的Ajax请求,如果请求的是一个“异源”地址,浏览器将不允许读取返回的内容. 支持同源 ...

  8. 三解炸弹人——DFS

    原创 枚举解炸弹人—— https://www.cnblogs.com/chiweiming/p/9295262.html BFS解炸弹人—— https://www.cnblogs.com/chiw ...

  9. Spring注解:Enable相关注解

    @EnableXXX:可以用于取代xml配置中的一些配置,被该注解所标注的类,其中被@Bean标注的方法,一般就用于返回和EnableXXX的XXX相关的Bean,Bean中一般有XXX相关的注解 同 ...

  10. delphi 指针 认识

    delphi 指针分为类型指针和无类型指针: 类型指针分为PChar.PInteger.PString等. 无类型指针Pointer. PPChar/PP...为指针的指针 @和Addr一样,为获取变 ...