P1564 膜拜

Aimee

很简单的dp

\(dp_i\)就表示在前i个里划分的区间数

那么很显然了

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
int n;
int sum[2501][2];
int x;
int m;
int dp[2501];
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;++i){
		scanf("%d",&x);
		sum[i][0]=sum[i-1][0]+(x==1);
		sum[i][1]=sum[i-1][1]+(x==2);
	}
	memset(dp,0x3f,sizeof(dp));
	dp[1]=0;
	dp[0]=0;
	for(int i=1;i<=n;++i){
		for(int j=0;j<i;++j){
			if(sum[i][0]-sum[j][0]==(i-j)||sum[i][1]-sum[j][1]==(i-j)||
			abs(sum[i][0]-sum[j][0]-sum[i][1]+sum[j][1])<=m){
				dp[i]=min(dp[i],dp[j]);
			}			
		}
		dp[i]+=1;
	}
	cout<<dp[n];
	return 0;
}
posted @ 2020-12-04 22:40  Simex  阅读(48)  评论(0编辑  收藏  举报