洛谷P1569-Generic Cow Protests(一维区间DP)

题目描述:

约翰家的n头奶牛聚集在一起,排成一列,正在进行一项抗议活动。第i头奶牛的理智度为 ai。
约翰希望奶牛在抗议时保持理性,为此,他打算将所有的奶牛隔离成若干个小组,每个小组内的奶牛的理智度总和都要不小于零。
由于奶牛是按直线排列的,所以一个小组内的奶牛位置必须是连续的。请帮助约翰计算一下,最多分成几组。

输入格式:

第一行一个正整数 n,表示牛的数目。
接下来 n 行,每行一个整数,表示每个牛的理智度。

输出格式:

若存在合法分组方案,输出一行一个整数表示答案;否则输出 Impossible

样例输入:

4

2

3

-3

1  

样例输出: 

说明/提示:

【数据规模和约定】
对于 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;
}

猜你喜欢

转载自blog.csdn.net/weixin_43823808/article/details/107575738