[USACO11FEB]Generic Cow Protests

时间:2020-12-13 07:47:26

思路:

动态规划。
首先处理出这些数的前缀和$a$,$f_i$记录从第$1$位到第$i$位的最大分组数量。DP方程为:
$f_i=max(f_i,f_j+1)$,其中$j$满足$a_i-a_j≥0$。

 #include<cstdio>
#include<cstring>
#include<algorithm>
int main() {
int n;
scanf("%d",&n);
int a[n+];
a[]=;
int f[n+];
memset(f,,sizeof f);
for(int i=;i<=n;i++) {
scanf("%d",&a[i]);
a[i]+=a[i-];
if(a[i]<) continue;
for(int j=;j<i;j++) {
if(a[i]-a[j]>=) {
f[i]=std::max(f[i],f[j]+);
}
}
}
printf(f[n]?"%d\n":"Impossible\n",f[n]);
return ;
}