题意
给定 (n imes m) 的矩形,每个格子是 (0) 或 (1)。要求沿格线切割,求最小的切线长,使得切割后的每一块恰好有一个 (1)。切割的起点和重点不必是矩形边缘。
(n,m leq 20)
题解
设 (dp_{lx,ly,rx,ry}) 表示左上角为 ((lx,ly)),右下角为 ((rx,ry)) 的矩形中满足条件需要切割多少次。记忆化搜索,每次枚举将该矩形切成两块的线。
题意
有 (4) 堆糖,每堆 (n) 颗,每颗糖有颜色,每次可以将某一堆糖的顶端取掉一颗,然后放在篮子里,但篮子里的糖数不能超过 (5)。如果篮子里有两颗一样颜色的糖,那么可以拿走它们。问最多可以拿多少对糖。
(n leq 40)
题解
显然可以暴力 dp,(dp_{a,b,c,d}) 表示四堆糖还剩这么多的时候可以拿多少对。观察到 (a,b,c,d) 确定则篮子里的糖状态唯一,所以不必将篮子里的糖的状态表示在 dp 状态里。
题意
有 (n) 个车站和一些线路,某些线路从某个时刻出发向右开,某些则向左。列车运行速度相同,(i,i+1) 两站距离为 (t_i)。问 (0) 时刻在车站 (1),(T) 时刻到达车站 (n) 所需要的最小等车时间(同站换乘等待时间)。
- (n leq 50)
- (T leq 200)
题解
(dp_{t,i}) 表示时刻 (t) 在车站 (i) 最小的等待时间,转移即可,转移方程显然。需要辅助数组保存时刻 (t) 在车站 (i) 是否有往左 / 右开的车,降低转移时间复杂度。
题意
给定 (n) 种长方体,第 (i) 种长宽高分别为 (x_i,y_i,z_i),每种都有无数个。你可以选择旋转长方体,使其底面变化。
当长方体 (i) 底面的长宽严格小于 (j) 底面长宽时,(i) 可以放在 (j) 上。求可以达到的最大高度。
(n leq 30)
题解
根据题意将一种长方体拆成三个((x_i imes y_i,y_i imes z_i,x_i imes z_i) 为底面),然后枚举建边,观察到得到的是 DAG,DAG 上 DP 即可。
题意
给定 (m imes n) 的整数矩阵,从第一列任意位置出发,每次可以向右上,右,右下走一步。求到达最后一列时,经过的权值和的最大值。如果当前在第 (1) 行,往右上走到达下一列第 (n) 行。如果当前在第 (n) 行,往右下走到达下一列第 (1) 行。
(m leq 10,n leq 10)
题解
根据题意建立状态 (dp_{i,j}) 表示在第 (i) 列第 (j) 行时的最大权值,DP 即可。
题意
在 KTV 里,给定 (n) 首歌的长度,分别为 (a_1,a_2,...,a_n) 秒,和能够使用 KTV 的时间 (t)。在使用时间结束时,如果有没有唱完的歌,那么 KTV 会等你唱完这首歌。你需要选择一些歌来唱,但必须在离开前唱一首 (678) 秒的《劲歌金曲》。问最多能唱多少首歌,在此前提下最晚可以多久离开 KTV。
(n leq 50,t leq 10^9,sum a_i + 678 > t,a_i leq 180)
题解
在结束前一秒开始唱《劲歌金曲》。剩下的 (t-1) 秒 DP 即可,01 背包模型。
题意
给定 (n) 个正实数 (a_1,a_2,...,a_n)。求至少需要删除几个,这样剩下的 (a_i) 满足以下条件:
- 设 (m) 表示删除后剩余的数量,则 (a_1 < a_2 < ... < a_i) 或 (a_i > a_{i+1} > ... > a_m)
题解
(dp_{i,0/1}) 表示 ([1,i]) 组成的最长上升子序列 / ([i,n]) 组成的最长下降子序列。
分类讨论:
- (a_1<a_2<...<a_k>a_{k+1}>...>a_m):答案为 (maxlimits_{1 leq i leq n}{dp_{i,0}+dp_{i,1}-1})
- (a_1<a_2<...<a_k=a_{k+1}>...>a_m):答案为 (maxlimits_{1 leq i eq j leq n}{dp_{i,0}+dp_{j,1}})
题意
求 (S) 与 (T) 的最长公共子序列。
(|S|,|T| leq 5cdot 10^3)
题解
DP 经典模型,设 (dp_{i,j}) 表示 (S) 前 (i) 位 (T) 前 (j) 位组成的最长公共子序列,则:
- 当 (S_i eq T_j),(dp_{i,j} = max{dp_{i-1,j},dp_{i,j-1}})
- 当 (S_i = T_j),(dp_{i,j} = dp_{i-1,j-1} + 1)
题意
给定长度为 (n) 的数列 (a_1,a_2,...,a_n)。删除 (a_i(1<i<n)) 的代价是 (a_{i-1} imes a_{i} imes a_{i+1})。求数列只剩下两个数时,最小的代价是多少。
(n leq 100,1 leq a_i leq 100)
题解
区间 DP。定义 (dp_{i,j}) 表示删除区间 ([i,j]) 的最小代价。枚举区间中最后一个删除的数转移即可。
题意
求数列的最大子段和。
题解
。
题意
给定字符串 (s),将其划分成若干个回文串,要求划分的个数最小。
(1 leq |s| leq 1000)
题解
可以 (O(n^2)) 区间 DP 求出区间 ([l,r]) 是否是回文串。设 (dp_{i}) 表示前 (i) 个字符的划分结果,转移即可。
题意
给定含有 ((,),[,]) 的括号序列 (s),求出一个最短的合法括号序列 (t),使得 (s) 是 (t) 的子序列。
(|s| leq 100)
题解
考虑递归求解。
- 如果序列为空,停止递归。
- 如果序列长度为 (1),将这一对括号补全。
- 如果两侧的括号匹配,那么不需要添加括号,将两侧的括号删除后递归。
- 否则,找到一个最优的中点,将当前序列以中点分成两部分分别递归。最优的中点可以通过简单的区间 DP 求出。