Codeforces1155 D. Beautiful Array(dp,最大子段和变形)

题意:

给定长度为n的序列a,和一个整数x
你可以选择序列中一个连续子区间,将其中元素全部乘上x
最多进行这个操作一次,问最后序列的最大子段和是多少

数据范围:n<=3e5,-100<=x<=100

解法:

dp[i][0]表示前i个数,不进行乘法的最大字段和
dp[i][1]表示前i个数,正进行乘法的最大字段和
dp[i][2]表示前i个数,进行过乘法的最大字段和
第一维可以优化掉

最后就是最大子段和取max需要对所有d[i][2]取max,而不是d[n][2]

code:

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxm=3e5+5;
int d[3];
int a[maxm];
int n,x;
signed main(){
    cin>>n>>x;
    for(int i=1;i<=n;i++)cin>>a[i];
    int ans=0;
    for(int i=1;i<=n;i++){
        d[0]=max(a[i],d[0]+a[i]);
        d[0]=max(0LL,d[0]);
        //
        d[1]=max(d[0],d[1]+a[i]*x);//这时候d[0]是已经算上a[i]的了
        d[2]=max(d[1],d[2]+a[i]);//这时候d[1]是已经算上a[i]的了
        ans=max(ans,d[2]);
    }
    cout<<ans<<endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_44178736/article/details/107791369