做法
\(f_{i,0}\)表示以\(i\)结尾未操作时的最大值
\(f_{i,1}\)表示以\(i\)结尾正在操作时的最大值
\(f_{i,2}\)表示以\(i\)结尾已结束操作时的最大值
Code
#include<bits/stdc++.h>
typedef long long LL;
const int maxn=1e6+9;
LL ans,n,x;
LL a[maxn],f[maxn][3];
int main(){
std::cin>>n>>x;
for(LL i=1;i<=n;++i){
std::cin>>a[i];
f[i][0]=std::max(f[i-1][0]+a[i],0LL);
f[i][1]=std::max(f[i-1][1]+a[i]*x,f[i][0]);
f[i][2]=std::max(f[i-1][2]+a[i],f[i][1]);
ans=std::max(ans,f[i][2]);
}
std::cout<<ans;
}
本文介绍了一种使用动态规划解决特定问题的方法,通过定义三种状态:未操作、正在操作和已结束操作,来求解以每个位置结尾时的最大值。代码示例展示了如何用C++实现这一算法,包括初始化状态数组、更新状态和获取最终答案。
311

被折叠的 条评论
为什么被折叠?



