动态规划习题分类题解 (202103) - 2. 简单高维DP
[CF2B] Theleastroundway
Description
给定由非负整数组成的n×n 的正方形矩阵,你需要寻找一条路径:
以左上角为起点
每次只能向右或向下走
以右下角为终点 并且,如果我们把沿路遇到的数进行相乘,积应当是最小“round”,换句话说,应当以最小数目的0的结尾.
Solution
考虑到最终答案只取决于 (2,5) 因子数中最小的那一个,所以可以拆开考虑,然后就是一个朴素的最小和路径dp了
注意如果原矩阵中包含零,答案要和 (1) 取 min
一下
[CF837D] Round Subset
Description
给你一个长度为 (n) 的数列,要求你从中选出 (k) 个数,使得这些选出的数的积的末尾 (0) 的个数大。
Solution
设 (f[i][j][k]) 表示从前 i 个数中选了 j 个,已经有了 k 个 5,最多能有多少个 2
[CF19B] Checkout Assistant
Description
有 n 件商品,每件有价格 ci 和扫描时间 ti。当正在扫描时,可以花费 1 秒偷走一件。求最少付钱数。扫描商品顺序任意。(n le 4000)
Solution
所谓完成,就是当前已有的商品件数不小于 n
对于 ci,ti,我们相当于在增加 ti+1 件商品的同时,花费了 ci 的代价
现在问题就是凑到 n 件商品怎么使得代价最小,即一个 01 背包
[CF118D] Caesar's Legions
Description
有 n1 个步兵和 n2 个骑兵,禁止超过 k1 个步兵连续排列,超过 k2 个骑兵连续排列。求方案数。所有的步兵和骑兵都是相同的。(n le 100, k le 10)
Solution
设 (f[i][j][k][l]) 表示排了 i 个步兵,j 个骑兵,与最后一个人相同的人已经连了 k 个,并且最后一个人是 l
转移只需要枚举下一个人是骑兵还是步兵即可
[CF295C] GregandFriends
Description
有一只载重为 (k le 5 imes10^3) 的船在两岸之间往返,有 (n le 50) 个人要过河,每个人的体重只能使 (50) 或 (100),问最少的来回次数以及对应的方案数。
Solution
设 (f[i][j][0/1]) 表示对岸已经有 (i) 个 (50) 和 (j) 个 (100) 时最少的航行次数,(g[i][j][0/1]) 为对应的方案数
枚举本次走的 (k,l) 个数,利用组合数进行转移即可
最多转移 (2n) 轮一定能完事,复杂度 (O(n^5))
[CF479E] RidinginaLift
Description
一个楼有N层,由于你很无聊,你开始玩电梯。你的初始位置在A层,有个神秘实验室在B层,所以你的移动会受到如下限制:假设你在x层,你能走到的y层都要满足 |x - y| < |x - b|. 你不能走到B层或者留在原地。问一共走K次,有多少种走法。(n,k le 5000)
Solution
前缀和优化 dp
[CF1133E] KBalancedTeams
Description
现有 (n) 个人,每个人都有各自的能力值,要你把他们分成 (k) 组(每组人数不限),使得每组中任意两个人的能力值之差不超过 (5),问你最多可以把多少人分到组中。
Solution
设 (f[i][j]) 表示将前 (i) 个人分成 (j) 段的最大总人数(第 (i) 个人未必被使用)
其中 (l=lower\_bound(a[i]-5)-1)
[CF1198D] RectanglePainting1
Description
给 (n imes n) 矩阵只含 .
或#
,请用价值和最少的一堆长方形覆盖所有的 #
,一个长方形的价值是长与宽的最大值 ((1le nle 50))
Solution
设 (f[il][ir][jl][jr]) 为处理掉这个矩形区域的最小代价
记忆化搜索即可
[CF1286A] Garland
Description
有一个由 $ 1 $ - $ n $ 构成的排列,其中部分被删除(删除的元素由 $ 0 $ 代替),请用被删除的元素补全这个数列,使这个数列中相邻元素奇偶性不同的对数最少。(n le 100)
Solution
设 (f[i][j][0/1]) 表示用了 (i) 个奇数,(j) 个偶数,上一位是奇数或偶数时的最小值
[CF1353F] DecreasingHeights
Description
给定一个 (n imes m (n,m le 100)) 的矩阵,从 ((1,1)) 走到 ((n,m)),每次只能从权值为 (x) 的位置走到权值为 (x+1) 的位置,初态下可以对若干个格子进行一些操作,每次使得一个格子的权值减小 (1)。求最少要操作多少次使得存在合法的路径。
Solution
如果路径上第一个点的权值确定,那么整条路径的权值也随之确定。
因此我们暴力枚举第一个点的权值 (h) 然后 dp 即可。
令 (f[i][j]) 表示到达 ((i,j)) 为止花费的最小代价。
如果 (a[i][j]<h+i+j-2),则非法,直接令 (f[i][j] o infty)。
否则,需要花费 (a[i][j]-h-i-j+2),从 ((i-1,j)) 或 ((i,j-1)) 转移过来。
[CF1393D] RarityandNewDress
Description
给定一个 (n imes m) 的网格,每个格子有一个颜色,问有多少个同色菱形。(n,m le 2000)
Solution
类似“最大正方形”的套路,设 (f[i][j]) 表示以 ((i,j)) 点为下顶点的菱形的最大边长,转移时考虑 ((i,j),(i-1,j),(i-2,j),(i-1,j-1),(i-1,j+1)) 这五个点是否相等,如果相等则从 (f[i-1][j],f[i-2][j],f[i-1][j-1],f[i-1][j+1]) 中取最小值转移过来即可。
[CF1409F] SubsequencesofLengthTwo
Description
给定一个长度为 (n le 200) 的字符串 (S),和一个长度为 (2) 的字符串 (T),可以在 (S) 中任意修改不超过 (m) 个字符得到 (S'),求 (S') 中与 (T) 相等的子序列的最大数量。
Solution
设 (T) 串为 ab
,则定义 (f[i][j][k]) 表示对 (S') 中的前 (i) 位,其中有 (j) 个 a
,且修改了 k
次的情况下,子序列的最大数量。转移时只需要枚举是否修改当前字符即可。
[CF1437C] ChefMonocarp
Description
有 n 道菜品被放入了一个烤炉中,每到菜品都有一个最佳取出的时间 (t_i)。现在按照一定顺序把菜品从烤炉中取出,每到菜品都有可能因为不在最佳时间被取出而造成不美味,定义这个不美味度为 (|T-t_i|),其中 T 是取出的时刻。求把所有菜品都取出来的最小不美味度。(n le 200)
Solution
考虑到取出所有菜品的顺序一定与他们完成的时间先后顺序相同,设 (f[i][j]) 表示到了时刻 (i) 取出了前 (j) 个菜品,那么很显然有转移 (f[i][j]=min (f[i-1][j],f[i-1][j-1]+|i-t[j]|)),可以压掉一维倒序转移。
[CF1446B] CatchingCheaters
Description
给定两个串 (s,t),长度 (le 5000),求对所有 (s) 的子串 (p) 和 (t) 的子串 (q),(4LCS(p,q)-|p|-|q|) 的最大值。LCS 指最长公共子序列。
Solution
设 (f[i][j]) 表示 (s) 考虑到第 (i) 个字符,(t) 考虑到第 (j) 个字符,两个前缀中所存在的 LCS 的最大长度。
转移时主要结合一下 LCS 与最大子段和的思想,即 if(s[i]==t[j]) f[i][j]=max(f[i-1][j-1],0ll)+2;else f[i][j]=max(f[i][j-1],f[i-1][j])-1;
[HAOI2007] 分割矩阵
Description
将 (a imes b) 的数字矩阵沿着数字间的缝隙做分割,分成 (n) 个矩形,每个矩形的分数是矩形内数字和,最小化各矩形分数的均方差。(a,b,n leq 10)
Solution
均方差定义为
于是就是要最小化 (sum a_i^2)
设 (f[i_1][j_1][i_2][j_2][k]) 表示将矩形 ((i_1,j_1)-(i_2,j_2)) 分割成 (k) 份,(sum a_i^2) 的最小值
转移无非就是枚举分割线,记忆化搜索即可
矩形求和用二维前缀和预处理
时间复杂度 (O(a^3b^3n^2))
[LOJ6217] 扑克牌
Description
给定一摞扑克牌,共 (n le 1000) 张,每张牌有两个属性 (a_i,b_i le 1000)。可以无限次进行以下两种操作:①对于堆顶的牌 ((a,b)),从上到下扔掉 (a) 张牌,得分 (+b);②将牌堆顶的牌放到底部。求能获得的最大得分。
Solution
连续拿走若干张牌的条件,和随意拿走若干张牌,其实是等价的。
证明:反证法,考虑不等价,即连续拿走 (x) 时必须拿走 (y),但是 (y) 是想要另拿的。此时若我们可以先把 (y) 拿掉则矛盾。若我们不可以先拿走 (y),那么一定有 (a_x+a_y >n),则此时不可能在不连续情况下另拿 (y),故矛盾。
于是问题转化为,总空间为 (n) 的背包,每种物品占用空间 (a_i),价值为 (b_i),求最大价值。
[USACO3.3] HomeontheRange
Description
给定一个 (N imes N) 的 (01) 矩阵,求边长至少为所有 (k) 的全 (1) 正方形个数。(N leq 250)
Solution
令 (f[i][j]) 表示以 ((i,j)) 为右下角的最大全 (1) 正方形边长,则
- 如果 (a[i][j]=1),那么 (f[i][j]=1+min(f[i][j-1],f[i-1][j-1,f[i-1][j]))
- 如果 (a[i][j]=0),则 (f[i][j]=0)
最后扫一遍 (f) 统计答案即可
[USACO08JAN] RunningS
Description
需要进行 (n) 分钟的晨跑,在第 (i) 分钟内可以跑 (d_i) 米,疲劳度会增加 (1),无论何时疲劳度不能超过 (m),休息一分钟疲劳度会减少 (1),休息就必须要休息到疲劳度为 (0),疲劳度恢复到 (0) 就不会继续下降。初态下疲劳度为 (0)。结束时疲劳度也必须恢复到 (0)。求最多能跑多远。(n leq 10^4, d_i leq 1000, m leq 500)
Solution
设 (f[i][j]) 表示考虑前 (i) 分钟,结束时疲劳度为 (j),所能获得的最大距离,转移时决策这一秒是跑还是开始休息即可
[USACO08MAR] CowTravellingS
Description
给定一个 (N imes M) 的网格,有些格子是障碍,求走 (T) 步,从 ((R_1,C_1)) 走到 ((R_2,C_2)) 的方案数
Solution
暴力 DP,设 (f[t][i][j]) 表示走了 (t) 步,从起点走到 ((i,j)) 的方案数,暴力转移即可。