s[i]表示前i个人对神牛的膜拜情况,如果膜拜神牛甲则s[i]=s[i-1]+1否则s[i]=s[i-1]-1。那么如果|s[i]-s[j]|<=m或者=i-j+1(也就是人数差不超过m或者全部崇拜某一个神牛),f[i]=min(f[i],f[i-j]+1)
下放代码
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<cmath> 5 using namespace std; 6 const int maxn=2505; 7 int n,m,f[maxn],s[maxn],a; 8 int main(){ 9 scanf("%d%d",&n,&m); 10 for(int i=1;i<=n;i++){ 11 scanf("%d",&a); 12 if(a==1)s[i]=s[i-1]+1; 13 else s[i]=s[i-1]-1; 14 } 15 memset(f,101,sizeof(f)); 16 f[1]=1; 17 for(int i=2;i<=n;i++) 18 for(int j=0;j<i;j++){ 19 int c=abs(j?(s[i]-s[j-1]):(s[i])); 20 if(c==i-j+1||c<=m) 21 f[i]=min(f[i],f[j-1]+1); 22 } 23 printf("%d",f[n]); 24 return 0; 25 }