持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第5天,点击查看活动详情
本文已参与「新人创作礼」活动,一 起开启掘金创作之路。
D. Maximum Sum on Even Positions
题面
中文大意
最多将一段连续区间中的数字反转求反转求进行(0 - 1)次操作后偶数位上数字和的最大值
解法
- 我们发现如果旋转的话在奇数长度下是不改变最终答案的如果是偶数长度下我们可以看成答案改变了偶数位与奇数的差值
- 经过步骤1我们会或者一个奇数位和偶数位的差值数组我们只需再dp求一次区间最大值即可
Code
int a[N];
int dp[N];
int v[N];
void solve()
{
int res = 0;
int n; cin >> n;
int len = 0;
for(int i = 0; i < n; i++) cin >> a[i];
for(int i = 0; i < n ; i += 2) {
if(i + 1 < n)
v[len ++] = a[i + 1] - a[i];
}
dp[0] = v[0];
res = max(res,dp[0]);
for(int i = 1; i < len; i++)
{
dp[i] = max(v[i],dp[i-1] + v[i]);
res = max(res,dp[i]);
}
// cout << res << endl;
len = 0;
for(int i = 1; i < n ; i += 2) {
if(i + 1 < n)
v[len ++] = a[i ] - a[i + 1];
}
dp[0] = v[0];
res = max(res,dp[0]);
for(int i = 1; i < len; i++)
{
dp[i] = max(dp[i - 1] + v[i],v[i]);
res = max(res,dp[i]);
}
// cout << res << endl;
rep(i,n) if(i & 1) res += a[i - 1];
cout << res << endl;
}