P1569 [USACO11FEB]属牛的抗议Generic Cow Prote…
题目入口:P1569 [USACO11FEB]属牛的抗议Generic Cow Prote…
写在前面
不要看中文翻译,翻译有误
主要思想:
sum数组记录当前位置牛的理智度之和
dp数组记录分组到当前牛的最多分组数
AC代码
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
#define MaxSize 1010
int sum[MaxSize], dp[MaxSize];
//sum数组记录当前位置牛的理智度之和 dp数组记录分组到当前牛的最多分组数
int main() {
int n, tmp;
scanf("%d", &n);
for (int i = 1; i <= n; i++){
scanf("%d", &tmp);
sum[i] = sum[i-1] + tmp; //前缀和
if (sum[i] >= 0) dp[i] = 1; //标志分组到当前牛有方案(至少为1)
}
for (int i = 1; i <= n; i++)
for (int j = 1; j < i; j++)
if (dp[i] > 0 && sum[i]-sum[j] >= 0)
//当前牛之前从j到i理智度和非负(新方案出炉)
dp[i] = max(dp[i], dp[j]+1); //取更多方案数
if (!dp[n]) printf("Impossible\n"); //若无可行方案
else printf("%d\n", dp[n]); //输出最多方案数
return 0;
}