题解 P2545 【[AHOI2004]实验基地】
此题要求max(矩形值-上方最小连续子序列和)
我们枚举左右端点从左往右扫
观察到最小连续子序列和可以借助上一个位置的答案
于是我们就可以
#include"cstdio"
#include"cstring"
#include"iostream"
#include"algorithm"
using namespace std;
const int MAXN=3005;
int n,ans;
int a[2][MAXN];
int f[MAXN][MAXN];
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;++i) scanf("%d",&a[1][i]);
for(int i=1;i<=n;++i) scanf("%d",&a[0][i]);
for(int i=1;i<=n-2;++i){
int ct=0,minn=0x7fffffff,sum=a[1][i+1]+a[1][i]+a[0][i]+a[0][i+1];
for(int j=i+2;j<=n;++j){
ct=min(ct,0);
ct+=a[1][j-1];minn=min(minn,ct);
sum+=a[0][j]+a[1][j];
ans=max(ans,sum-minn);
}
}printf("%d\n",ans);
return 0;
}