Link:Vjudge Workbook
HDU-1159 Common Subsequence
最长公共子序列板子题。
dp[i][j]=⎩⎨⎧dp[i−1][j−1]+1max(dp[i−1][j],dp[i][j−1])otherwise(si=tj)
HDU-5904 LCIS
由于是连续值,可以先预处理出数组 a,b 的满足条件的最长公共子序列。
fa[a[i]]fb[b[i]]=fa[a[i]−1]+1=fb[b[i]−1]+1
然后枚举最后的答案以哪个数字结尾就可以了,即:
ans=max{fa[i]+fb[i]}
POJ-2241 The Tower of Babylon
由于没有个数的限制,所以对于每个物品 (x,y,z) 可以拆成 (x,y,z),(x,z,y),(y,z,x),所以剩下的问题就可以用 DP 解决了。
定义 dpi 表示将 i 放在最上面的塔的最高高度。
dp[i]=max1≤j<i(dp[i],dp[j]+a[i].z)
POJ-1887 Testing the CATCHER
最长不上升子序列板子题。
dpi=aj≤aimax(dpi,dpj+1)
Luogu-P1095 守望者的逃离
首先记 dpi 表示只使用魔法在时刻 i 的最远移动距离,则有:
dpi=max⎩⎨⎧dpi−1+60dpi−1m≥10otherwisem←m+4
然后对 dpi 进行微调:
dpi=max(dpi,dpi−1+17)
判断是否存在 dpi≥S 即可。
Luogu-P1280 尼克的任务
由于从前往后处理的约束条件很多,不妨从后往前处理。
令 dpi 表示在 i 时刻的最大空闲时间,则有:
dpi=j,lj=imax(dpi,dpi+rj);
如果不存在 j 使得 lj=i,则:
dpi=dpi+1+1
Luogu-P1868 饥饿的奶牛
先对区间进行排序,定义 dpi 表示前 i 个区间里能吃到的最多的草堆的个数。
dpi=∀j,rj<imax(dpi−1,dpj+(ri−li+1))
由于这样的转移是 O(n2) 的,我们需要优化。
考虑排序后区间具有单调性,需要的条件又为 rj<i,则可以对满足条件的 j 进行二分,复杂度为 O(nlogn)。
Luogu-P1541 乌龟棋
定义 dpi,j,k,l 表示 4 种类型的卡片分别有 i,j,k,l 张时的最大得分。
dpi,j,k,l=max⎩⎨⎧dpi−1,j,k,l+ai+2×j+3×k+4×ldpi,j−1,k,l+ai+2×j+3×k+4×ldpi,j,k−1,l+ai+2×j+3×k+4×ldpi,j,k,l−1+ai+2×j+3×k+4×li>0j>0k>0l>0
Luogu-P3847 调整队形
区间 DP,定义 dpi,j 表示区间 [i,j] 满足条件的最小操祚次数。
转移如下:
- 如果 ai=aj,则 dpi,j=dpi+1,j−1;
- ∀i,j,dpi,j=min(dpi,j,dpi+1,j+1,dpi,j−1+1,dpi+1,j−1+1)。
HDU-5891 Two
定义 dpi,j 表示当枚举到 a 的第 i 位和 b 的第 j 位时的答案。
dpi,j={dpi−1,j+dpi,j−1+1dpi−1,j+dpi,j−1−dpi−1,j−1ai=bjotherwise
Luogu-P1470 最长前缀 Longest Prefix
定义 fi 表示长度为 i 的前缀是否可以北分解为集合 P 中的元素。
枚举以 si 结尾的后缀,看是不是集合 P 的元素,设枚举的后缀长度为 j, 则:
dpi=dpi∣∣dpj
由于题面中说明了 P 中的元素长度不会超过 10, 所以复杂度为 O(10n)=O(n),常数较大但可过。
HDU-2845 Beans
这题有一个很有趣的性质:
每一行的限制时相互独立的
所以对于每一行,我们定义 fi,j 表示处理到第 i 行的第 j 列时的最大收益。则有:
fi,j=max(fi,j−1,fi,j−2+ai,j)
令 gi=1≤j≤mmax(fi,j),ti 为处理到第 i 行时的最大收益,同上可得:
ti=max(ti−1,ti−2+gi)