题目描述
小刚家的 n 只兔子聚集在一起,排成一列,正在进行一项抗议活动。第 i 只兔子的理智度为 ai。小刚希望兔子在抗议时保持理性,为此,他打算将所有的兔子隔离成若干个小组,每个小组内的兔子的理智度总和都要不小于零。由于兔子是按直线排列的,所以一个小组内的兔子位置必须是连续的。请帮助小刚计算一下,最多分成几组。
输入格式
第一行一个正整数 n,表示兔子的数目。
接下来 n 行,每行一个整数,表示每个兔子的理智度。
输出格式
若存在合法分组方案,输出一行一个整数表示答案;否则输出 Impossible。
样例输入 #1
4
2
3
-3
1
样例输出 #1
3
提示
【数据规模和约定】
对于 30% 的数据,1≤n≤20;
对于 100% 的数据,1≤n≤1000,|ai|≤105。
#include<bits/stdc++.h>
using namespace std;
int n, m[1001], f[100000];
bool wzb(int x, int y) {
int ans = 0;
for (int i = x; i <= y; i++) {
ans += m[i];
}
if (ans >= 0)return 1;
else return 0;
}
int main() {
cin >> n;
int j = 0;
for (int i = 1; i <= n; i++) {
cin >> m[i];
j += m[i];
}
if (j < 0) {
cout << "Impossible";
return 0;
}
if (j == 0) {
cout << 1;
return 0;
}
f[0] = 0;
for (int i = 1; i <= n; i++) {
f[i] = -1;
}
for (int i = 1; i <= n; i++) {
for (int j = 0; j < i; j++) {
if (wzb(j + 1, i) && f[j] != -1)f[i] = max(f[j] + 1, f[i]);
}
}
cout << f[n];
return 0;
}