2021年ICPC银川B题 The Great Wall
题意:给你一排\(n\)个塔,每个塔有一定高度,需要将塔划分为\(k\)个区间,每个区间的收益为区间最大值与最小值之差,求\(k=1,2,3..n\)时的最大收益。
第一反应是倒过来搞,\(k=n\)时答案为0,把区间的拆分改为区间的合并。
但极差太难以递推,赛场上最终没有想出正解。
事后翻知乎,看到了大佬的一个很简单的思路:
B题 dp
直接dp,极差不方便转移
把差转化成 \(=a[i]-a[j]\) (\(i,j\)为区间内任意值)
不改变答案显然,
?满头问号?为啥可以直接把极差改成任意的 \(a[i]-a[j]\) 了?
仔细想一下,每个区间任取两个数相减,得到的结果一定小于极差。
那么考虑所有取法,得到结果的最大值和只取极差是一样的。
我们取所有\(a[i]\)的权重为1,\(a[j]\)的权重为-1,其余数权重为0,每个区间取一对±1即可
用\(dp[i,j,k]\)表示前\(i\)个数,已经取了\(j\)个区间(即\(j\)对\(±1\));
\(k=0/1/-1\),表示下一个区间已经包含了\(k\)
可以列出状态转移方程:
\[dp[i,j,0]=max
\left\{
\begin{aligned}
&dp[i-1,j,0]\\
&dp[i-1,j-1,-1]+a[i]\\
&dp[i-1,j-1,1]-a[i]
\end{aligned}
\right.
\]
\[dp[i,j,1]=max
\left\{
\begin{aligned}
&dp[i-1,j,1]\\
&dp[i-1,j,0]+a[i]\\
\end{aligned}
\right.
\]
\[dp[i,j,-1]=max
\left\{
\begin{aligned}
&dp[i-1,j,-1]\\
&dp[i-1,j,0]-a[i]\\
\end{aligned}
\right.
\]
PS:因为没有补题通道,这篇只交流思路。如果有错误恳请指出。