思路:
首先我们知道最大连续子序列的和的dp方程是:.
这题要我们求使得某一度乘以,然后求.一个显然的暴力是左边求一次最大连续子序列,右边求一次最大连续子序列,然后中间乘以.
但是这样的时间复杂度是的,显然不可取.那我们换种思路直接线性dp.
令表示到了第几个数,状态是哪个.这里我们设立三个状态::表示以结尾且未使用的的.表示以结尾的.表示以结尾且考虑了情况的.然后答案就是对三种状态取个.那么三种状态的转移方程如下:
.
.
.
时间复杂度就降到了.
代码:
#include <iostream> using namespace std; typedef long long ll; const int N=3e5+5,M=3; ll f[N][M],a[N]; int main() { ll n,x,ans=0; cin>>n>>x; for(int i=1;i<=n;i++) cin>>a[i]; for(int i=1;i<=n;i++) { f[i][0]=max(f[i-1][0]+a[i],a[i]); f[i][1]=max(max(f[i-1][0],f[i-1][1])+a[i]*x,a[i]*x); f[i][2]=max(max(f[i-1][2],max(f[i-1][1],f[i-1][0]))+a[i],a[i]); ans=max(ans,max(f[i][0],max(f[i][1],f[i][2]))); }cout<<ans<<'\n'; return 0; }