Codeforces 1155D

给一个序列,可以将一个连续子序列的每个值都乘x,问这样操作以后能得到的最大连续子序列的值是多少.
dp可搞,
dp[i][0]表示到i时没有使用乘x操作能获得的最大连续子序列的值dp[i][0] = max(a[i],dp[i-1][0] + a[i])
dp[i][1]表示到i时正处在在乘x的操作中能获得的最大连续子序列的值
则dp[i][1] = max(dp[i][1],max(dp[i-1][0],dp[i-1][1]) + a[i] * x)
dp[i][2]表示已经过了乘x操作的区间
dp[i][2] = max(dp[i][2],max(dp[i-1][1],dp[i-1][2])+a[i])
要注意爆int的问题

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 3e5 +10;
int x,n,a[N];
LL dp[N][3];
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	cin>>n>>x;
	for(int i = 1;i<=n;i++) cin>>a[i];
	for(int i = 1;i<=n;i++){
		dp[i][0] = max((LL)a[i],dp[i-1][0] + a[i]);
		dp[i][1] = max(dp[i][1],max(dp[i-1][0],dp[i-1][1]) + (LL)a[i] * x);
		dp[i][2] = max(dp[i][2],max(dp[i-1][1],dp[i-1][2])+ a[i]);
	}
	LL ans = 0;
	for(int i = 1;i<=n;i++)
		ans = max(max(ans,dp[i][0]),max(dp[i][1],dp[i][2]));
	cout<<ans;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/winhcc/article/details/89968870
今日推荐