【ACM】2021 ICPC 银川站 - dp题
回想ACM生涯,印象最深刻的似乎就是这两道在正式比赛中的绝杀题,两道题都是在最后一小时内憋出并成功拿下金银牌的关键题。一道是2019徐州的树上题,另一道就是这道2021银川dp题。这次来回顾一下后者的解法,前者就等以后再说吧(前面的区域,以后再来探索吧[doge])。
题目介绍(大意)
题目
有一个长度为
求如何分段能获得最高的总价值(
输入
第一行为两个空格分割的整数
第二行为
输出
所有分段方案中最高总价值。
样例输入1
1 | 5 1 |
样例输出1
1 | 4 |
样例输入2
1 | 5 2 |
样例输出2
1 | 6 |
解法1
思路
核心思路:将题目的解空间放宽
原本题意可构建dp数组,dp[i][j]表示要分为i段时前j个数字的最优解。
- 朴素算法即考虑第j个人可以和前面哪些人组成一组(最多j种情况,即[1,j]或[2,j]或…或[j,j]成一组)。设取[s,j]为一组,则分数为dp[i-1][s-1]+max(a[s],…,a[j])-min(a[s],…,a[j])。
- 故有O(n^3)的解法,转移方程为:dp[i][j] = max(dp[i-1][s-1]+max(a[s],…,a[i])-min(a[s],…,a[j]))【注意s的边界需要考虑】
将解空间放宽:将转移方程放大为:dp[i][j] = max(dp[i-1][s-1]+a[f1]-a[f2]),其中s与上述公式含义相同,f1和f2为[s,j]中的任意数字。很容易发现该公式与上述公式答案相同。
再考虑dp[i][j]和dp[i][j-1]的解空间间的差异即可简单递推。
设 {dp[x][y]}表示dp[x][y]的解空间(即dp[x][y]应当在该集合内搜索)
1
2
3
4
5
6
7
8
9
10
11
12{dp[i][j-1]} = {
dp[i-1][i-1]+a[i~j-1]-a[i~j-1],
dp[i-1][i]+a[i+1~j-1]-a[i+1~j-1],
...
dp[i-1][j-2]+a[j-1~j-1]-a[j-1~j-1]
}
{dp[i][j]} = {
dp[i-1][i-1]+a[i~j]-a[i~j],
dp[i-1][i]+a[i+1~j]-a[i+1~j],
...
dp[i-1][j-1]+a[j~j]-a[j~j]
}则有
1
2
3
4
5
6
7{dp[i][j]}-{dp[i][j-1]} = {
dp[i-1][i-1]+a[j]-a[i~j-1], dp[i-1][i-1]+a[i~j-1]-a[j], dp[i-1][i-1]+a[j]-a[j]
dp[i-1][i]+a[j]-a[i+1~j-1], dp[i-1][i]+a[i+1~j-1]-a[j], dp[i-1][i]+a[j]-a[j]
...
dp[i-1][j-2]+a[j]-a[j-1~j-1], dp[i-1][j-2]+a[j-1~j-1]-a[j], dp[i-1][j-2]+a[j]-a[j]
dp[i-1][j-1]+a[j]-a[j]
}可以发现,dp[i-1][x]-a[x+1
j-1] 的最大值 以及 dp[i-1][x]+a[x+1j-1] 的最大值 是可以O(1)维护的,设前者为maxDPaddA(即该数字为dp+a的最大值),后者为maxDPsubA(同理)则转移方程为 dp[i][j] = max(dp[i][j-1],maxDPaddA-a[j],maxDPsubA+a[j])
代码
1 | //#define ACM_LOCAL 1 |
解法2
思路(来自网络)
- 可以将每段价值转换成选择两个数相减,使得最后总和最大,那么最优必是最大值减去最小值,其实也可以看成选一个数乘上1,再选一个数乘上-1
- 那么设
1
2
3
4dp[i][j][0] 表示前 i 个数分成 j 段,且第 j 段还未选择两个数,
dp[i][j][1] 表示第 j 段已经选了一个数乘上1,
dp[i][j][2] 表示第 j 段已经选了一个数乘上-1,
dp[i][j][3] 表示第 j 段已经完了两个数。 - 那么转移就是 O(1) 转移,具体看代码。
代码(非常有简单美)
1 |
|
- 标题: 【ACM】2021 ICPC 银川站 - dp题
- 作者: Fre5h1nd
- 创建于 : 2023-05-16 21:12:48
- 更新于 : 2023-12-11 18:25:07
- 链接: https://freshwlnd.github.io/2023/05/16/algorithm/2021银川-dp/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论