USACO11FEB Generic Cow Protest

题目地址

题解

水$DP$,设$f(i)$为以$i$为某一组结尾的最大组数,那么

并且$sum[i]-sum[j]\ge 0$,$f(j)$有意义
被粗体字部分坑了一波。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cstring>
#include <cctype>
#define INF 2000000000
using namespace std;
typedef long long ll;
int read(){
int f=1,x=0;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-f;c=getchar();}
while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();
return f*x;
}
int n,a[1005],sum[1005]={0},dp[1005]={0};
void init(){
n=read();
for(int i=1;i<=n;i++)a[i]=read(),sum[i]=sum[i-1]+a[i],dp[i]=(sum[i]>=0);
}
void solve(){
if(sum[n]<0){
printf("Impossible\n");
return ;
}
for(int i=1;i<=n;i++)
for(int j=0;j<i;j++)
if(sum[i]-sum[j]>=0&&sum[j]>=0)
dp[i]=max(dp[i],dp[j]+1);
printf("%d\n",dp[n]);
}
int main(){
init();
solve();
return 0;
}