题目链接: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;
}