题意很简单,给出 n 个数字,要分成最多的区间数,使每个区间内的和大于等于前一个区间和。
思路:sum[]表示前缀和,dp[i]表示前 i 个数字的最多区间数,presum[i]表示只考虑前 i 个数时,最后一个区间的和,这样只要从末端枚举直到和大于等于 presum[j]就 break。
#include<cstring>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<vector>
#include<string>
#include<iostream>
#include<algorithm>
using namespace std;
long long sum[3010];
long long presum[3010];
int dp[3010];
int main(){
int n;
sum[0] = 0;
while(~scanf("%d", &n)){
presum[0] = 0;
dp[0] = 0;
for(int i = 1; i <= n; i++){
scanf("%lld", &sum[i]);
sum[i] += sum[i-1];
}
for(int i = 1; i <= n; i++){
for(int j = i-1; j >= 0; j--){
long long temp = sum[i]-sum[j];
if(temp >= presum[j]){
presum[i] = temp;
dp[i] = dp[j]+1;
break;
}
}
}
cout << dp[n] << endl;
}
return 0;
}