深入动态规划 知识点总结
【紫书:竞赛题目选讲】
例题9-18 跳舞机UVa 10618:踩下屏幕上出现的箭头,每种移动产生与上次移动有关的费用,求解最小费用。D[i][a][b][s]表示考虑到第i个箭头后左右脚分别位于ab上一次踩下s时的最小费用。对于无要求.有不移动与随便移动两种决策,对于四种箭头在满足限定的情况下有左右脚移动两种决策。由此划分子问题。
例题9-19 团队分组 UVa 1627:将n个人划分成两组,使得组内的人必须互相认识且两组人数差尽量的小。重新构图:对于不互相认识的两人之间连边,新图中的一个连通分量中分配已经定了,连通分量不能构成二分图则问题无解即不能将他们分成两组使满足要求 否则 有形成两组的人数差为d。每一个联通分量对应+d与-d两种情况。D[i][j+n]表示考虑到第i个连通分量相差j的情况是否存在。刷表法更新。
例题9-21 修缮长城 UVa 1336:机器人修缮数轴上的n个点每个点修缮代价为ci+ti*di 求修缮完n个点后的最小代价。已修点成连续区间,D[i][j][p]表示修完区间ij后位于p时最小的已知费用。每次得出的ans需要把未访问点在转移时间内需要的花费累计上。
例题9-23 有趣的游戏 UVa 1204:给出n个序列,构造一个最小的环使得所有给出序列为该序列的连续子序列。规定给出的expr[0]始终在首位,首先去掉被包含序列,因为开始可以左传也可以右传所以需要考虑每个串的正反向。d[S][i][x]表示已经考虑的序列集合为S且放在最后的是序列i方向为x时形成的包含S的最短序列。考虑S集合外的序列续接到尾部形成子问题。 最后累计的时候再考虑与expr[0]的重叠部分。
例题9-24 书架 UVa12099:将n本书分到3层使得W*H最小。按照书的高度排序,规定将最高的书放在第一层。D[i][a][b]表示考虑到第i本书时第二层与第三层宽度分别为ab时,二三层最小的高度和,第一层的宽度可推知,因为已经排序过,所以在第二三层放书时若已经有书高度是不变的。选择将书放到三层划分子问题。
例题9-26 一个调度问题 UVa1380:给一棵任务调度树,有向边代表有顺序无限边代表无顺序,+一个定理,得出最少多少天完成。有向边的顺序已经定下了,关键是给每一个无向边定向判断是否可以满足最长链点数<=maxlen。Fg完成。
例题9-31 送披萨 UVa1628:可以不选的修缮长城。D[i][j][p][s]表示送完了区间ij(不理或送)位于p还剩s个客户需要送。在Cu(i,j)中找一个客户送餐默认 间着的客户 为不送,划分子问题。
【白书:例题讲解】
例题31 捡垃圾的机器人 UVAlive 3983:设d[i]表示捡完前i个垃圾后的最小路长。得出表达式d[i]=min{func(j),w(j+1,i)<=c} + lalala 单调队列优化:用单调队列维护一个满足w(front+1,rear)的滑动窗口,窗口中仅留下func值递增的数据。计算d[i]时单调队列可以在O(1)的时间将一个满足w(front+1,rear)<=c且func值最小的q[front]返回。
例题32 分享巧克力 UVAlive 4794:是否可以将x*y的巧克力分成n个面积为a1,a2…an的小巧克力。设d[S][x]表示一个短边为x的矩形是否可以分为集合中面积。切一刀枚举子集划分子问题。