Beautiful Array(线性dp)

D. Beautiful Array

D - Beautiful Array

题意:

一个长为n的数组,一个x,选择数组的一个区间,该区间里的数*x,使得该数组的最大子序和最大

求最大子序和

解析:

用动态规划解决

dp[i][j]为前i个数再j状态下的最大值

dp[i][0]表示以i为终点还没进入加倍区的最大子段和。
dp[i][1]表示以i为终点在加倍区内的最大子段和。
dp[i][2]表示以i为终点离开加倍区的最大子段和。

ac:

#include <bits/stdc++.h>
#define ll long long
#define MAXN 300005
using namespace std;

ll dp[MAXN][3],ans;

int main()
{
    ll n,x,y;
    scanf("%lld%lld",&n,&x);
    for(int i=1;i<=n;i++)
    {
        scanf("%lld",&y);
        dp[i][0]=max(0LL,dp[i-1][0]+y);
        dp[i][1]=max(0LL,max(dp[i-1][0],dp[i-1][1])+y*x);
        dp[i][2]=max(0LL,max(dp[i-1][1],dp[i-1][2])+y);
        ans=max(ans,dp[i][0]);
        ans=max(ans,dp[i][1]);
        ans=max(ans,dp[i][2]);
    }
    printf("%lld\n",ans);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_41183791/article/details/89491197