题目描述:
约翰家的n头奶牛聚集在一起,排成一列,正在进行一项抗议活动。第i头奶牛的理智度为 ai。
约翰希望奶牛在抗议时保持理性,为此,他打算将所有的奶牛隔离成若干个小组,每个小组内的奶牛的理智度总和都要不小于零。
由于奶牛是按直线排列的,所以一个小组内的奶牛位置必须是连续的。请帮助约翰计算一下,最多分成几组。
输入格式:
第一行一个正整数 n,表示牛的数目。
接下来 n 行,每行一个整数,表示每个牛的理智度。
输出格式:
若存在合法分组方案,输出一行一个整数表示答案;否则输出
Impossible
。
样例输入:
4
2
3
-3
1
样例输出:
3
说明/提示:
【数据规模和约定】
对于 30% 的数据,1≤n≤20;
对于 100% 的数据,1≤n≤1000,∣ai∣≤105。
AC Code:
#include<bits/stdc++.h>
using namespace std;
#define N 1010
int n,dp[N],sum[N];
int main() {
scanf("%d",&n);
for(int i=1;i<=n;i++) {
scanf("%d",&sum[i]);
sum[i]+=sum[i-1];//记录每一段的和
if(sum[i]>=0) {
dp[i]=1;//至少分成一组
}
}
for(int i=1;i<=n;i++) {//遍历1~n
for(int j=0;j<i;j++) {//从0到i-1找到第j个数,满足下面的条件
if(dp[j]>0&&sum[i]-sum[j]>=0) {
dp[i]=max(dp[i],dp[j]+1);//状态转移方程
}
}
}
if(dp[n]==0) {//无法分组,始终等于0
printf("Impossible\n");
}else {
printf("%d\n",dp[n]);
}
return 0;
}