思路:
首先我们知道最大连续子序列的和的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;
}
京公网安备 11010502036488号