Loading

2020.08.16 周作业简要题解

\[\huge\text{UVA1629} \]

题意

给定 \(n\times m\) 的矩形,每个格子是 \(0\)\(1\)。要求沿格线切割,求最小的切线长,使得切割后的每一块恰好有一个 \(1\)。切割的起点和重点不必是矩形边缘。

\(n,m \leq 20\)

题解

\(dp_{lx,ly,rx,ry}\) 表示左上角为 \((lx,ly)\),右下角为 \((rx,ry)\) 的矩形中满足条件需要切割多少次。记忆化搜索,每次枚举将该矩形切成两块的线。

\[\huge\text{UVA10118} \]

题意

\(4\) 堆糖,每堆 \(n\) 颗,每颗糖有颜色,每次可以将某一堆糖的顶端取掉一颗,然后放在篮子里,但篮子里的糖数不能超过 \(5\)。如果篮子里有两颗一样颜色的糖,那么可以拿走它们。问最多可以拿多少糖。

\(n \leq 40\)

题解

显然可以暴力 dp,\(dp_{a,b,c,d}\) 表示四堆糖还剩这么多的时候可以拿多少对。观察到 \(a,b,c,d\) 确定则篮子里的糖状态唯一,所以不必将篮子里的糖的状态表示在 dp 状态里。

\[\huge\text{UVA1025} \]

题意

\(n\) 个车站和一些线路,某些线路从某个时刻出发向右开,某些则向左。列车运行速度相同,\(i,i+1\) 两站距离为 \(t_i\)。问 \(0\) 时刻在车站 \(1\)\(T\) 时刻到达车站 \(n\) 所需要的最小等车时间(同站换乘等待时间)。

  • \(n \leq 50\)
  • \(T \leq 200\)

题解

\(dp_{t,i}\) 表示时刻 \(t\) 在车站 \(i\) 最小的等待时间,转移即可,转移方程显然。需要辅助数组保存时刻 \(t\) 在车站 \(i\) 是否有往左 / 右开的车,降低转移时间复杂度。

\[\huge\text{UVA437} \]

题意

给定 \(n\) 种长方体,第 \(i\) 种长宽高分别为 \(x_i,y_i,z_i\),每种都有无数个。你可以选择旋转长方体,使其底面变化。

当长方体 \(i\) 底面的长宽严格小于 \(j\) 底面长宽时,\(i\) 可以放在 \(j\) 上。求可以达到的最大高度。

\(n \leq 30\)

题解

根据题意将一种长方体拆成三个(\(x_i \times y_i,y_i \times z_i,x_i \times z_i\) 为底面),然后枚举建边,观察到得到的是 DAG,DAG 上 DP 即可。

\[\huge\text{UVA116} \]

题意

给定 \(m \times n\) 的整数矩阵,从第一列任意位置出发,每次可以向右上,右,右下走一步。求到达最后一列时,经过的权值和的最大值。如果当前在第 \(1\) 行,往右上走到达下一列第 \(n\) 行。如果当前在第 \(n\) 行,往右下走到达下一列第 \(1\) 行。

\(m \leq 10,n \leq 10\)

题解

根据题意建立状态 \(dp_{i,j}\) 表示在第 \(i\) 列第 \(j\) 行时的最大权值,DP 即可。

\[\huge\text{UVA12563} \]

题意

在 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 背包模型。

\[\huge\text{POJ1836} \]

题意

给定 \(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\):答案为 \(\max\limits_{1 \leq i \leq n}\{dp_{i,0}+dp_{i,1}-1\}\)
  • \(a_1<a_2<...<a_k=a_{k+1}>...>a_m\):答案为 \(\max\limits_{1 \leq i \neq j \leq n}\{dp_{i,0}+dp_{j,1}\}\)

\[\huge\text{POJ1458} \]

题意

\(S\)\(T\) 的最长公共子序列。

\(|S|,|T| \leq 5\cdot 10^3\)

题解

DP 经典模型,设 \(dp_{i,j}\) 表示 \(S\)\(i\)\(T\)\(j\) 位组成的最长公共子序列,则:

  • \(S_i \neq 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\)

\[\huge\text{POJ1651} \]

题意

给定长度为 \(n\) 的数列 \(a_1,a_2,...,a_n\)。删除 \(a_i(1<i<n)\) 的代价是 \(a_{i-1} \times a_{i} \times a_{i+1}\)。求数列只剩下两个数时,最小的代价是多少。

\(n \leq 100,1 \leq a_i \leq 100\)

题解

区间 DP。定义 \(dp_{i,j}\) 表示删除区间 \([i,j]\) 的最小代价。枚举区间中最后一个删除的数转移即可。

\[\huge\text{HDU1231} \]

题意

求数列的最大子段和。

题解

\[\huge\text{UVA11584} \]

题意

给定字符串 \(s\),将其划分成若干个回文串,要求划分的个数最小。

\(1 \leq |s| \leq 1000\)

题解

可以 \(O(n^2)\) 区间 DP 求出区间 \([l,r]\) 是否是回文串。设 \(dp_{i}\) 表示前 \(i\) 个字符的划分结果,转移即可。

\[\huge\text{UVA1626} \]

题意

给定含有 \((,),[,]\) 的括号序列 \(s\),求出一个最短的合法括号序列 \(t\),使得 \(s\)\(t\) 的子序列。

\(|s| \leq 100\)

题解

考虑递归求解。

  • 如果序列为空,停止递归。
  • 如果序列长度为 \(1\),将这一对括号补全。
  • 如果两侧的括号匹配,那么不需要添加括号,将两侧的括号删除后递归。
  • 否则,找到一个最优的中点,将当前序列以中点分成两部分分别递归。最优的中点可以通过简单的区间 DP 求出。
posted @ 2020-09-26 20:02  Meatherm  阅读(114)  评论(0编辑  收藏  举报