CodeForces - 1155D(dp + 最大区间和的变形)

题目链接:https://vjudge.net/contest/349967#problem/A

思路:

dp重点就是找状态,感觉状态有了转移方程也就好写了。

这题目有三个状态:

dp(i,0) 当前节点不×z的情况

dp(i,1) 当前节点正在×z的情况

dp(i,2) 当前节点退出×z状态的情况。

代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 3e5+10;
ll dp[N][3] = {0},a[N],x;
int main(void)
{
    int n;
    scanf("%d%lld",&n,&x);
    ll ans = 0;
    for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
    for(int i=1;i<=n;i++){
        dp[i][0] = max(dp[i][0],dp[i-1][0]+a[i]);
        dp[i][1] = max(dp[i][1],max(dp[i-1][0]+a[i]*x,dp[i-1][1]+a[i]*x));
        dp[i][2] = max(dp[i][2],max(dp[i-1][1]+a[i],dp[i-1][2]+a[i]));
        ans = max(ans,dp[i][0]);
        ans = max(ans,dp[i][1]);
        ans = max(ans,dp[i][2]);
    }
    printf("%lld\n",ans);
    return 0;
}
扫描二维码关注公众号,回复: 8800003 查看本文章
发布了438 篇原创文章 · 获赞 16 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_41829060/article/details/103781630