P1564 膜拜
很简单的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;
}