[CSP-S模拟测试]:优化(贪心+DP)

题目描述

$visit\text{_}world$发现有下优化问题可以用很平凡的技巧解决,所以他给你分享了这样一道题:
现在有长度为$N$的整数序列$\{ a_i\}$,你需要从中选出$K$个不想叫的连续子区间(可以存在元素不被选),从左到右记它们的和为$s_1,s_2,...,s_k$,我们的优化目标是最大化下述和式:
$$\sum \limits_{i=1}^{k-1}|s_i-s_{i+1}|$$
你只需要输出这个最大的和即可。


输入格式

第一行两个整数$N,K$,意义如上。
接下来一行$N$个整数,第$i$个数表示$a_i$,保证有$|a_i|\leqslant 10^4$。


输出格式

输出一行一个整数,表示答案。


样例

样例输入:

5 3
5 2 4 3 1

样例输出:

12


数据范围与提示

样例解释:

选择$(5),(2,4,3),(1)$三个子段,$|5-9|+|9-1|=12$

数据范围:

对于全部的测试数据,保证$N\leqslant 3\times 10^4,K\leqslant \min(N,200)$。
$\bullet$子任务$1$($10$分):$K\leqslant 3$。
$\bullet$子任务$2$($30$分):$N\leqslant 400,K\leqslant 50$。
$\bullet$子任务$3$($20$分):$N\leqslant 10^3,K\leqslant 100$。
$\bullet$子任务$4$($40$分):无特殊限制。


题解

利用贪心思想,这$k$个序列一定是一高一低的,不可能连续三个及以上持续上升或下降。

对于高的序列,其贡献为$+2$;对于低的序列,其贡献为$-2$;而中间也会有一些并不选的状态,其贡献为$0$,而对于这些状态,其接下来会有高或低的序列,为了区分它们,不妨将其称为上升状态$or$下降状态。

考虑$DP$,设$dp[i][j][0/1/2/3]$表示前$i$个数,分成了$j$段,当前状态是高、低、上升、下降状态。

状态转移很简单,需要注意的是对于边界的处理,即$j=1$和$j=K$的情况。

时间复杂度:$\Theta(NK)$。

期望得分:$100$分。

实际得分:$100$分。


代码时刻

#include<bits/stdc++.h>
using namespace std;
int N,K;
int w[30001];
int dp[30001][201][4];
int main()
{
	scanf("%d%d",&N,&K);
	for(int i=1;i<=N;i++)
		scanf("%d",&w[i]);
	memset(dp,-0x3f,sizeof(dp));
	for(int i=1;i<=N;i++)dp[i][0][0]=dp[i][0][1]=dp[i][0][2]=dp[i][0][3]=0;
	dp[0][0][0]=dp[0][0][1]=dp[0][0][2]=dp[0][0][3]=0;
	for(int i=1;i<=N;i++)
	{
		dp[i][1][0]=max(dp[i-1][1][0],dp[i-1][0][2])+w[i];
		dp[i][1][1]=max(dp[i-1][1][1],dp[i-1][0][3])-w[i];
		dp[i][1][2]=max(dp[i-1][1][2],dp[i][1][1]);
		dp[i][1][3]=max(dp[i-1][1][3],dp[i][1][0]);
		dp[i][K][0]=max(dp[i-1][K][0],dp[i-1][K-1][2])+w[i];
		dp[i][K][1]=max(dp[i-1][K][1],dp[i-1][K-1][3])-w[i];
		dp[i][K][2]=max(dp[i-1][K][2],dp[i][K][1]);
		dp[i][K][3]=max(dp[i-1][K][3],dp[i][K][0]);
		for(int j=2;j<K;j++)
		{
			dp[i][j][0]=max(dp[i-1][j][0],dp[i-1][j-1][2])+2*w[i];
			dp[i][j][1]=max(dp[i-1][j][1],dp[i-1][j-1][3])-2*w[i];
			dp[i][j][2]=max(dp[i-1][j][2],max(dp[i][j][1],dp[i-1][j-1][2]));
			dp[i][j][3]=max(dp[i-1][j][3],max(dp[i][j][0],dp[i-1][j-1][3]));
		}
	}
	printf("%d",max(dp[N][K][2],dp[N][K][3]));
	return 0;
}


rp++

原文地址:https://www.cnblogs.com/wzc521/p/11743598.html

时间: 2024-08-30 10:42:56

[CSP-S模拟测试]:优化(贪心+DP)的相关文章

[CSP-S模拟测试]:折射(DP)

题目描述 小$Y$十分喜爱光学相关的问题,一天他正在研究折射. 他在平面上放置了$n$个折射装置,希望利用这些装置画出美丽的折线. 折线将从某个装置出发,并且在经过一处装置时可以转向,若经过的装置坐标依次为$(x_1,y_1),(x_2,y_2),...(x_k,y_k)$,则必须满足: $\bullet \forall j\in (1,k],y_j<y_{j−1}$ $\bullet \forall j\in (2,k],x_{j−2}<x_j<x_{j−1}or\ x_{j−1}&l

[CSP-S模拟测试]:tree(DP)

题目传送门(内部题57) 输入格式 第一行包含一个数:$n$表示树的节点数.接下来$n-1$行,每行包含两个数:$u,v$表示无根树的一条边. 输出格式 输出$n$行,第$i$行包含一个浮点数,保留三位小数,表示第$i$号点第一次访问的期望时间. 样例 样例输入: 31 22 3 样例输出: 1.0002.0005.000 数据范围与提示 样例解释: 样例解释:容易分析出,所有可能情况下,到达$1$号点和$2$号点的时间都分别是:$1$和$2$,我们考虑$3$号点的到达时间,所有可能的过程:$1

[CSP-S模拟测试]:题(DP)

题目描述 由于出题人赶时间所以没办法编故事来作为背景.一开始有$n$个苹果,$m$个人依次来吃苹果,第$i$个人会尝试吃$u_i$或$v_i$号苹果,具体来说分三种情况.$\bullet 1.$两个苹果都还在,那么这个人将随便选一个苹果吃了.$\bullet 2.$只有一个苹果,那么这个人将吃掉这个苹果.$\bullet 3.$都不在了,这个人吃不到苹果就走了.请问有多少对苹果$(i,j)(i<j)$满足它们两个都幸存下来的概率$>0$. 输入格式 第一行两个数$n,m$.接下来$m$行,每行

[CSP-S模拟测试]:花(DP)

题目传送门(内部题111) 输入格式 一个整数$T$,表示测试数据组数. 每组测试数据占一行,两个整数,分别表示$L$和$S$. 输出格式 对每组数据,输出一个整数表示答案. 样例 样例输入1: 13 7 样例输出1: 7 样例输入2: 24 210 11 样例输出2: 4410199993 数据范围与提示 样例$1$解释: 一共有$7$种形态,每种形态能构成$1$个方案. 样例$2$解释: AAAB ABBB BAAA BBBA 数据范围: 对于$60\%$的数据,$L\leqslant 30

[CSP-S模拟测试]:蛇(DP+构造+哈希)

题目传送门(内部题140) 输入格式 前两行有两个长度相同的字符串,描述林先森花园上的字母. 第三行一个字符串$S$. 输出格式 输出一行一个整数,表示有多少种可能的蛇,对$10^9+7$取模. 样例 样例输入1: rwbyybwrrwby 样例输出1: 4 样例输入2: oooooooo 样例输出2: 14 数据范围与提示 对于$20\%$的数据,$n,|S|\leqslant 16$. 对于$40\%$的数据,$n,|S|\leqslant 40$. 对于$60\%$的数据,$n,|S|\l

csp-s模拟测试92

csp-s模拟测试92 关于$T1$:最短路这一定建边最短路. 关于$T2$:傻逼$Dp$这一定线段树优化$Dp$. 关于$T3$:最小生成树+树P+换跟一定是这样. 深入(?)思考$T1$:我是傻逼. 深入(?)思考$T2$:我是天才! 深入(?)思考$T3$:我是天才! 100 01:14:19 10 02:36:26 15 03:19:48 125 03:19:48 事实证明我是傻逼. A. 数列 故意删掉负数读入$Rp--$ $Exgcd$,对绝对值大力分类讨论,一次函数求最值. 考场死

2018冬令营模拟测试赛(三)

2018冬令营模拟测试赛(三) [Problem A]摧毁图状树 试题描述 输入 见"试题描述" 输出 见"试题描述" 输入示例 见"试题描述" 输出示例 见"试题描述" 数据规模及约定 见"试题描述" 题解 这题没想到贪心 QwQ,那就没戏了-- 贪心就是每次选择一个最深的且没有被覆盖的点向上覆盖 \(k\) 层,因为这个"最深的没有被覆盖的点"不可能再有其它点引出的链覆盖它了,而它又

2018-10-25 模拟测试题解

目录 问题 A: 魏传之长坂逆袭 题目描述 输入 输出 样例输入 样例输出 题解 问题 B: 蜀传之单刀赴会 题目描述 [问题描述] 输入 输出 样例输入 样例输出 题解 问题 C: 吴传之火烧连营 [题目背景] [问题描述] 输入 输出 样例输入 样例输出 [样例解释] [数据规模和约定] 题解 本篇题解也发表于zwcblog作者是同一个人 问题 A: 魏传之长坂逆袭 题目描述 众所周知,刘备在长坂坡上与他的一众将领各种开挂,硬生生从曹操手中逃了出去,随后与孙权一起火烧赤壁.占有荆益.成就霸业

模拟测试68,69

68: 32 AlpaCa 41 03:08:20 31 02:46:16 30 02:46:28 102 03:08:20 69: 28 AlpaCa 20 02:51:15 60 03:05:32 0 01:39:45 80 03:05:32 彻底挂掉了呢. 不过也还好吧,至少之后的考试不会有那么大压力了吧(出第一机房是肯定的事了),那利用之后几场考试就调整好状态,下次再来嘛. 但是最近炸了那么多场还是要反思一下,其实不只是心态的问题,自身实力,考试技巧,时间分配等方面好像都有点问题. 69