E. Pchelyonok and Segments
题链
我们可以发现答案最多是sqrt(2n)个 也就是500个
考虑dp
dp[i][j]表示前i个 分成了j段 且第j段的max
转移就是
dp[i][j]=max{dp[i][j],s[i]-s[i-j]}[dp[i-j][j-1]>s[i]-s[i-j]]
int dp[100010][510];
void solve(){
int n;cin>>n;
vector<int>a(n);
for(int i=0;i<n;i++)cin>>a[i];
reverse(all(a));
a.push_back(0);
for(int i=n;i>=1;i--)a[i]=a[i-1];
a[0]=0;
vector<int>s(n+1);
for(int i=1;i<=n;i++)s[i]=s[i-1]+a[i];
//dp[i][j]表示前i个数分了j段且第j段的max
int ans=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=(int)sqrt(2*n);j++){
dp[i][j]=dp[i-1][j];
if(i>=j&&(s[i]-s[i-j]<dp[i-j][j-1]||j==1))
dp[i][j]=max(dp[i][j],s[i]-s[i-j]);
if(dp[i][j])ans=max(ans,j);
}
}
cout<<ans<<endl;
}
标签:750,int,max,Codeforces,Round,dp
From: https://www.cnblogs.com/ycllz/p/17022495.html