Link:Vjudge Workbook

HDU-1159 Common Subsequence

最长公共子序列板子题。

dp[i][j]={dp[i1][j1]+1(si=tj)max(dp[i1][j],dp[i][j1])otherwisedp[i][j] = \begin{cases} dp[i - 1][j - 1] + 1 & (s_{i} = t_{j}) \\ \max(dp[i - 1][j], dp[i][j - 1]) \\ otherwise \end{cases}

HDU-5904 LCIS

由于是连续值,可以先预处理出数组 a,ba, b 的满足条件的最长公共子序列。

fa[a[i]]=fa[a[i]1]+1fb[b[i]]=fb[b[i]1]+1\begin{aligned} fa[a[i]] &= fa[a[i] - 1] + 1 \\ fb[b[i]] &= fb[b[i] - 1] + 1 \end{aligned}

然后枚举最后的答案以哪个数字结尾就可以了,即:

ans=max{fa[i]+fb[i]}ans = max\{fa[i] + fb[i]\}

POJ-2241 The Tower of Babylon

由于没有个数的限制,所以对于每个物品 (x,y,z)(x, y, z) 可以拆成 (x,y,z),(x,z,y),(y,z,x)(x, y, z), (x, z, y),(y, z, x),所以剩下的问题就可以用 DP 解决了。

定义 dpidp_{i} 表示将 ii 放在最上面的塔的最高高度。

dp[i]=max1j<i(dp[i],dp[j]+a[i].z)dp[i] = max_{1 \le j < i}(dp[i], dp[j] + a[i].z)

POJ-1887 Testing the CATCHER

最长不上升子序列板子题。

dpi=maxajai(dpi,dpj+1)dp_{i} = \max_{a_{j} \le a_{i}}(dp_{i}, dp_{j} + 1)

Luogu-P1095 守望者的逃离

首先记 dpidp_{i} 表示只使用魔法在时刻 ii 的最远移动距离,则有:

dpi=max{dpi1+60m10dpi1otherwisemm+4\begin{aligned} &dp_{i} = \max \begin{cases} dp_{i - 1} + 60 & m \geq 10 \\ \\ dp_{i-1} & otherwise \end{cases} \\ \\ &m \leftarrow m + 4 \end{aligned}

然后对 dpidp_{i} 进行微调:

dpi=max(dpi,dpi1+17)dp_{i} = \max(dp_{i}, dp_{i-1} + 17)

判断是否存在 dpiSdp_{i} \geq S 即可。

Luogu-P1280 尼克的任务

由于从前往后处理的约束条件很多,不妨从后往前处理。

dpidp_{i} 表示在 ii 时刻的最大空闲时间,则有:

dpi=maxj,lj=i(dpi,dpi+rj);dp_{i} = \max_{j, l_{j} = i}(dp_{i}, dp_{i + r_{j}});

如果不存在 jj 使得 lj=il_{j} =i,则:

dpi=dpi+1+1dp_{i} = dp_{i + 1} + 1

Luogu-P1868 饥饿的奶牛

先对区间进行排序,定义 dpidp_{i} 表示前 ii 个区间里能吃到的最多的草堆的个数。

dpi=maxj,rj<i(dpi1,dpj+(rili+1))\begin{aligned} dp_{i} = \max_{\forall j, r_{j < i}} (dp_{i-1}, dp_{j} + (r_{i} - l_{i} + 1)) \end{aligned}

由于这样的转移是 O(n2)O(n^2) 的,我们需要优化。

考虑排序后区间具有单调性,需要的条件又为 rj<ir_j < i,则可以对满足条件的 jj 进行二分,复杂度为 O(nlogn)O(n \log n)

Luogu-P1541 乌龟棋

定义 dpi,j,k,ldp_{i,j,k,l} 表示 44 种类型的卡片分别有 i,j,k,li,j,k,l 张时的最大得分。

dpi,j,k,l=max{dpi1,j,k,l+ai+2×j+3×k+4×li>0dpi,j1,k,l+ai+2×j+3×k+4×lj>0dpi,j,k1,l+ai+2×j+3×k+4×lk>0dpi,j,k,l1+ai+2×j+3×k+4×ll>0dp_{i,j,k,l} = \max \begin{cases} dp_{i - 1,j,k,l} + a_{i + 2 \times j + 3 \times k + 4 \times l} & i > 0 \\ dp_{i,j - 1,k,l} + a_{i + 2 \times j + 3 \times k + 4 \times l} & j > 0 \\ dp_{i,j,k - 1,l} + a_{i + 2 \times j + 3 \times k + 4 \times l} & k > 0 \\ dp_{i,j,k,l - 1} + a_{i + 2 \times j + 3 \times k + 4 \times l} & l > 0 \\ \end{cases}

Luogu-P3847 调整队形

区间 DP,定义 dpi,jdp_{i, j} 表示区间 [i,j][i, j] 满足条件的最小操祚次数。

转移如下:

  • 如果 ai=aja_{i} = a_{j},则 dpi,j=dpi+1,j1dp_{i, j} = dp_{i + 1, j - 1};
  • i,j\forall i, jdpi,j=min(dpi,j,dpi+1,j+1,dpi,j1+1,dpi+1,j1+1)dp_{i, j} = \min(dp_{i, j}, dp_{i + 1, j} + 1, dp_{i, j - 1} + 1, dp_{i + 1, j - 1} + 1)

HDU-5891 Two

定义 dpi,jdp_{i, j} 表示当枚举到 aa 的第 ii 位和 bb 的第 jj 位时的答案。

dpi,j={dpi1,j+dpi,j1+1ai=bjdpi1,j+dpi,j1dpi1,j1otherwisedp_{i, j} = \begin{cases} dp_{i - 1, j} + dp_{i, j - 1} + 1 & a_{i} = b_{j} \\ dp_{i - 1, j} + dp_{i, j - 1} - dp_{i - 1, j -1} & otherwise \end{cases}

Luogu-P1470 最长前缀 Longest Prefix

定义 fif_{i} 表示长度为 ii 的前缀是否可以北分解为集合 PP 中的元素。

枚举以 sis_{i} 结尾的后缀,看是不是集合 PP 的元素,设枚举的后缀长度为 jj, 则:

dpi=dpi∣∣dpjdp_{i} = dp_{i} \operatorname{||} dp_{j}

由于题面中说明了 PP 中的元素长度不会超过 1010, 所以复杂度为 O(10n)=O(n)O(10n) = O(n)常数较大但可过

HDU-2845 Beans

这题有一个很有趣的性质:

每一行的限制时相互独立的

所以对于每一行,我们定义 fi,jf_{i, j} 表示处理到第 ii 行的第 jj 列时的最大收益。则有:

fi,j=max(fi,j1,fi,j2+ai,j)f_{i, j} = \max(f_{i, j - 1}, f_{i, j - 2} + a_{i, j})

gi=max1jm(fi,j)\displaystyle g_{i} = \max_{1\leq j\leq m}(f_{i, j})tit_{i} 为处理到第 ii 行时的最大收益,同上可得:

ti=max(ti1,ti2+gi)t_{i} = \max(t_{i - 1}, t_{i - 2} + g_{i})