[002] P11642题解(幸运草)
由于很难(根本不能?)确定某段区间往双向拓展后是否有对答案贡献更大的修改区间,还想不到可解的贪心。不过使用类 P1115 的新手级 dp 就能很轻松找到最好的修改区间来解决本题。
解析部分
首先构造
于是我们可以先找出
然后在转移时,需要判断一下当前位置应该属于以上两者中哪一种情况,用变量
代码部分
为了保全祖宗建议使用 long long 来实现本题。)
#include <bits/stdc++.h>
#define int long long
using namespace std;
int n,x,l,r,ans,a[100005],f[100005],b[100005],dp[100005];
signed main(){
ios::sync_with_stdio(false);
cin.tie(NULL);cout.tie(NULL);
cin>>n>>x;
for(int i=1;i<=n;i++) cin>>a[i],f[i]=f[i-1]+a[i],b[i]=x-a[i];
ans=f[n];//需要注意不修改的特殊情况
for(int i=1;i<=n;i++){
if(dp[i-1]+b[i]>b[i]){
r=i;//事实上在过程中 r 一定等于 i
}
else l=r=i;
dp[i]=max(dp[i-1]+b[i],b[i]);
ans=max(ans,(r-l+1)*x+f[l-1]+f[n]-f[r]);
}
cout<<ans;
return 0;
}
/*
*/