CodeForces-1155D Beautiful Array(DP)

最大子段和的变种吧,
分析决策状态都在什么大体情况下产生,
或者分析候选答案的集体特征吧,
我们分析三种状态,dp(i,j),
dp(i,1)表示还未进入到修改序列的状态,
dp(i,2)表示正在修改序列的状态,
dp(i,3)表示已经退出修改序列的状态,
很明显对于每一个dp状态我们都可以纳入决策答案,
我们是相当于暴力枚举dp状态,转移的同时不断更新最后的答案.

在这里插入图片描述

题目大意:数组的美值是此数组的某个连续子数组的最大总和(此子数组可能为空),现在存在一个有Ñ个数的

数组,同时拥有一个数X,你能够选择该数组的某个子段乘于X,求出该数组美值得最大值。

分析:定义三个DP数组:DP1 [],DP2 [],DP3 []

其中dp1 [i]表示以a [i]结尾的最大子段和

DP2 [I]表示以A [1] * X结尾的最大子段和

dp3 [i]表示以a [i]结尾,并且[a]前存在一个区间的数组* x,该情况下的最大子段和

转移方程:dp1 [i] = a [i] +(dp1 [i-1]> 0?dp1 [i-1]:0)

dp2 [i] = a [i] * x + max(max(dp1 [i-1],dp2 [i-1]),0)

dp3 [i] = a [i] + max(dp2 [i-1],dp3 [i-1])。

结果则为三个DP数组中的最大值。
dp [i] [0]:以a [i]结尾的最大字段和,前面先不考虑是不是以a [i]还是a [i] * x结尾 dp [i] [1]:以A [1] * X结尾的最大字段和,考虑前面是以A [1]还是以一个[I] * X结尾 DP [I] [2]:以一个[I]结尾的最大字段和,考虑前面是以A [1],A [1] * X或者前面的前面的以A [1],A [1] * X结尾 `C 的#include <比特/ STDC ++。H> 使用命名空间std ; typedef long long ll; const int maxn = 4 * 1e5; ll maxx,n,x,a [maxn],dp [maxn] [5] ; int main(){scanf(“%lld%lld”,&n,&x); for(ll i = 1; 我<= n; i ++){scanf(“%lld”,&a [i]); } maxx = 0; // cout << maxx << endl; for(int i = 1; i <= n; i ++) { dp [i] [0] = max(dp [i-1] [0] + a [i],a [i]);

    DP [I] [1] = MAX(最大(DP [I-1] [1] + A [1] * X,DP [I-1] [0] + A [1] * x)时,A [ 1] * X); 
    DP [I] [2] = MAX(最大(MAX(DP [I-1] [1] + A [1],DP [I-1] [2] + A [1]),DP〔I-1 ] [0] + A [1]),A [1]); 
    MAXX = MAX(MAXX,最大值(DP [I] [0],最大值(DP [I] [1],DP [I] [2]))); 
    // cout << maxx << endl; 
} 
 cout << maxx << endl; 返回0; ````

描述给定一个由Ñ个整数组成的数组。数组之美是此数组的某个连续子数组的最大总和(此子数组可能为空)。例如,数组[10,-5,10- ,-4,1]的美丽是15,并且数组[-3,-5,-1]的美丽是0。您最多可以选择a的一个连续子数组,并将该子数组中包含的所有值乘以x。你想要在应用最多一个这样的操作后最大化阵列的美感。输入第一行包含两个整数n和x(1≤n≤3⋅105,-100≤x≤100) - 数组a的长度和整数x。第二行包含n个整数a1,a2,…,(-109≤ai≤109) - 数组a。产量

Print one integer — the maximum possible beauty of array a after multiplying all values belonging to some consecutive subarray x.

Examples
Input

5 -2
-3 8 -2 1 -6
Output

22
Input

12 -3
1 3 3 7 1 3 3 7 1 3 3 7
Output

42
Input

5 10
-1 -2 -3 -4 -5
Output

0解d1 [i]:以a [i]结尾的最大子段和d2 [i]:a [i]被乘以x且以a [i]结尾的最大子段和d3 [i]:a [ I]没有被乘以X,但在A [1]之前有一个区间被乘以X,以一个[I]御姐结尾所有游戏该区间的最大子段状语从句:答案就是最大(maxni = 1( D1 [I]),maxni = 1(D2 [1]),maxni = 2(D3 [1]))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值