题目
思路
参考我的题解(复制链接浏览器中打开)
https://www.yuque.com/yuqueyonghufn88nb/lc3lpn/id6ng7hshls2ltxg?singleDoc# 《子问题套子问题》
代码
/*
author:cheng xiangbo
time:2024/02/21
*/
#include<bits/stdc++.h>
using namespace std;
const int N=1e3+10;
#define int long long
constexpr int inf=1e9;
int n;
int w[N];
int dp[N][N],f[N];
void solve(){
cin>>n;
for(int i=1;i<=n;i++) cin>>w[i];
for(int l=1;l<=n;l++){
array<int,6> mn,mx;
mn.fill(inf),mx.fill(-inf);
for(int r=l;r<=n;r++){
for(int i=5;~i;i--){
if(r-l>=i){
if(!i){
mx[i]=max(mx[i],w[r]);
mn[i]=min(mn[i],w[r]);
}
else if(i&1){
mx[i]=max({mx[i],mx[i-1]-w[r],mn[i-1]-w[r]});
mn[i]=min({mn[i],mn[i-1]-w[r],mx[i-1]-w[r]});
}else{
mx[i]=max({mx[i],mx[i-1]*w[r],mn[i-1]*w[r]});
mn[i]=min({mn[i],mn[i-1]*w[r],mx[i-1]*w[r]});
}
}
}
dp[l][r]=mx.back();
}
}
f[0]=0;
for(int i=1;i<=n;i++){
f[i]=f[i-1];
for(int j=0;j<i;j++)
f[i]=max(f[i],f[j]+dp[j+1][i]);
}
cout<<f[n]<<'\n';
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t;
// cin>>t;
t=1;
while(t--){
solve();
}
}