0722杂题

LOJ2966

考虑区间 \(dp\)\(dp_{l,r,p}\) 表示当前区间 \([l,r]\),删到只剩下 \(p\) 个相同的数。\(f_{l,r}\) 表示将区间 \([l,r]\) 删空的代价。

考虑转移,我们先枚举 \(dp_{l,r,p}\)\([l,x]\) 转移来,那么一定是 \(p-1\) 个,而 \(r\) 是第 \(p\) 个。这就要求 \(c_x\)\(c_r\) 相等。

然后,枚举 \(f_{l,r}\) 是从连续几个转移来,转移代价是 \(\max\{0,k-p\}\)

最后,\(f_{l,r}\) 也可能是断开区间分别删,枚举断点。

复杂度 \(O(n^4)\)

DP N

考虑区间 \(dp\),设 \(dp_{l,r}\) 表示将区间 \([l,r]\) 合并成 \(s_r-s_{l-1}\) 的最小代价。

我们只需要枚举断点然后合并即可。

CF607B

考虑区间 \(dp\),设 \(f_{l,r}\) 表示当前将 \([l,r]\) 删的只剩一个回文串的最小代价,\(g_{l,r}\) 表示当前将 \([l,r]\) 删的只剩下一个回文串和 \(r\) 的最小代价,\(dp_{l,r}\) 表示当前将 \([l,r]\) 删空的代价。

考虑先预处理所有的回文串,判断一个 \([l,r]\) 是否回文只需要判断 \([l+1,r-1]\) 是否回文并且 \(l\) 是否和 \(r\) 相同。

然后考虑转移,\(f_{l,r}\) 一定从 \(g_{x,r}\) 转移来,并且要求 \(a_l=a_r\),转移代价是 \(dp_{l+1,x-1}\)\(g_{l,r}\) 一定从 \(f_{l,x}\) 转移来,转移代价 \(dp_{x+1,r-1}\)

\(dp_{l,r}\) 可以从 \(f_{l,r}\) 转移来,也可以从 \(dp_{l,x}+dp_{x+1,r}\) 转移来。

复杂度 \(O(n^3)\)

ABC273F

考虑区间 \(dp\),我们只考虑那些涉及到新墙的步骤,所以先将所有墙和起点终点离散化,设 \(dp_{l,r,x}\) 表示当前已经探索过 \([l,r]\),目前的人在最左端/最右端。

然后我们进行转移,一种转移是在当前方向转移,一种转移是往相反方向转移,转移代价都是目标和当前位置的差。

我们发现,\([l,r]\) 内的部分我们一定探查过,所以如果当前墙的锤子在 \([l,r]\) 之内,我们一定可以破除当前墙。特别的,如果墙的锤子在当前的区间端点到墙之间,我们也可以破除当前墙。否则不行。

我们从 \(dp_{s,s}\) 开始,找到所有能包含 \(t\) 的方案,取最小值即可。或者记忆化搜索,也很好写。

复杂度 \(O(n^2)\)

LOJ10147

我们首先考虑类似哈夫曼树的贪心,每次找到合并起来代价最大的相邻位置进行合并。但是这样是有反例的。

我们仅考虑链的情况,3 4 2 5

按照贪心算法会得到 3 6 5,9 5,14,答案=29。

但是正确的做法是 7 2 5,7 7,14,答案=28。

这是为什么呢?因为贪心做法只是在某个区间内达到了最优解,而为了这个最优解而强行过早的合并这两个区间,反而会导致这个区间本身贡献次数太多。

那么链的 Hack 拓展到环也是容易的,我们在破环的地方加一个无穷大,这样它一定是最后选的,也就和链一样了。

那么,就要考虑 \(dp\) 做法,设 \(dp_{l,r}\) 表示在环上,沿着顺时针从 \(l\) 走到 \(r\) 的部分,将其全部合并的最大/最小花费。

这样子,我们只需要模拟 \(l\)\(r\) 的走向,就可以和普通的区间 \(dp\) 一样转移,最后找到所有长度为 \(n\) 的区间中答案按最大/最小的即可。

posted @ 2023-07-22 15:02  jucason_xu  阅读(11)  评论(0编辑  收藏  举报