题目描述:
约翰家的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; }