luogu P1564 膜拜 |动态规划

题目描述

神牛有很多…当然…每个同学都有自己衷心膜拜的神牛.

某学校有两位神牛,神牛甲和神牛乙。新入学的N 位同学们早已耳闻他们的神话。

所以,已经衷心地膜拜其中一位了。现在,老师要给他们分机房。但是,要么保证整个机房都是同一位神牛的膜拜者,或者两个神牛的膜拜者人数差不超过M。另外,现在N位同学排成一排,老师只会把连续一段的同学分进一个机房。老师想知道,至少需要多少个机房。

输入格式

输入文件第一行包括N 和M。

之后N 行,每行一个整数,1 表示神牛甲的崇拜者,2 表示神牛乙的崇拜者。

输出格式

输出一个整数,表示最小需要机房的数量。

.

直接O( n²)的动态规划

f[i]表示前i个人分的最少的机房

细节请看代码

#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define int long long
using namespace std;
const int N=2515;
int f[N],s1[N],s2[N];
signed main(){
	int n,m;
	cin>>n>>m;
	for(int i=1,x;i<=n;i++){
		s1[i]=s1[i-1];//前缀和
		s2[i]=s2[i-1];
		scanf("%lld",&x);
		if(x==1)s1[i]++;
		else s2[i]++;
		f[i]=1e9;//初始化
		for(int j=0;j<i;j++)//判断是否满足条件
		if(s1[i]-s1[j]==0||s2[i]-s2[j]==0||abs(s1[i]-s1[j]-(s2[i]-s2[j]))<=m)
		f[i]=min(f[i],f[j]+1);//判断分一个机房更优,或不分更优
	}
	cout<<f[n]<<endl;
}
posted @ 2019-09-28 11:02  白木偶君  阅读(120)  评论(0编辑  收藏  举报