【题目描述】
某学校有两位神牛,神牛甲和神牛乙。新入学的N位同学们早已耳闻他们的神话。所以,已经衷心地膜拜其中一位了。
现在,老师要给他们分机房。
但是,要么保证整个机房都是同一位神牛的膜拜者,或者两个神牛的膜拜者人数差不超过M。
另外,现在N位同学排成一排,老师只会把连续一段的同学分进一个机房。老师想知道,至少需要多少个机房。
【输入描述】
输入文件第一行包括N和M。
之后N行,每行一个整数,1表示神牛甲的崇拜者,2表示神牛乙的崇拜者。
【输出描述】
输出一个整数,表示最小需要机房的数量。
【样例输入】
5 1
2
2
1
2
2
【样例输出】
2
【数据范围及提示】
对于30%的数据,有1≤N,M≤50
对于100%的数据,有1≤N,M≤2500
源代码: #include<cstdio> #include<cstring> #include<algorithm> //包含整型的abs()。 using namespace std; int m,n,i[2501],f[2501]; int main() { scanf("%d%d",&n,&m); memset(f,0x3f,sizeof(f)); //初始化最大值,为后面找最小值做准备。 for (int a=1;a<=n;a++) scanf("%d",&i[a]); f[0]=0; //边界条件。 for (int a=1;a<=n;a++) { int t1(0),t2(0); if (i[a]==1) t1=1; else t2=1; for (int b=a-1;b>=0;b--) //从当前节点倒序更新,并求出其最小值。 { if (abs(t1-t2)<=m||(!t1||!t2)) //若一方为0,则一定只占1间。 f[a]=f[a]<f[b]+1?f[a]:f[b]+1; if (i[b]==1) //更新各类人数。 t1++; else t2++; } } printf("%d",f[n]); return 0; }