#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=3e3+5,inf=1e18;
int _t,n,dp[N][N],p[N],f[N],k;
void upd(int x,int y){
for (int i=x; i<=k; i+=i&(-i))
f[i]=max(f[i],y);
}
int get(int x){
int ret=-inf;
for (int i=x; i>0; i-=i&(-i))
ret=max(ret,f[i]);
return ret;
}
signed main(){
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
cin>>n;
for (int i=1; i<=n; i++) cin>>p[i],p[i]+=p[i-1];
for (int i=0; i<=n; i++) dp[i][1]=p[i];
for (int j=2; j<=n; j++){
k=0; vector <int> v;
for (int i=1; i<=n; i++){
if (dp[i][j-1]<inf){
auto it=lower_bound(v.begin(),v.end(),dp[i][j-1]+p[i]);
if (it==v.end() || *it!=dp[i][j-1]+p[i])
v.push_back(dp[i][j-1]+p[i]);
}
auto it=lower_bound(v.begin(),v.end(),p[i]);
if (it==v.end() || *it!=p[i])
v.push_back(p[i]);
}
sort(v.begin(),v.end()); k=(int)v.size();
for (int i=1; i<=k; i++) f[i]=-inf;
for (int i=1; i<=n; i++){
dp[i][j]=min(inf,p[i]-get(lower_bound(v.begin(),v.end(),p[i])-v.begin()+1));
if (dp[i][j-1]<inf) upd(lower_bound(v.begin(),v.end(),dp[i][j-1]+p[i])-v.begin()+1,p[i]);
// cout<<i<<" "<<j<<" - "<<dp[i][j]<<"\n";
}
}
for (int j=n; j>0; j--)
if (dp[n][j]<inf){
cout<<j<<"\n"; break;
}
}
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |