洛谷P1564 膜拜 題解
阿新 • • 發佈:2021-01-08
膜拜 - 洛谷
description:
給定一串
個僅含有 數字的串,請將其分割成若干個子串,使得其中滿足只有 或者 ,或者兩種數字的數量之差不超過 。solution:
比較基礎的
。首先,字首和統計出
中兩種數字之差。隨便搞搞就行,不過如果把所有的
標記成 的話就可以直接累加下去了。然後設
表示前 個人至少需要的機房數量。那麼對於一個
,其能轉移到 當且僅當其只存在一種數字或者兩種數字之差不超過 。code:
#include <cstdio>
#include<algorithm>
using namespace std;
int abs(int x)
{
if(x<0)return -x;
return x;
}
int f[100005],a[100005],b[100005],d[10005],c[10005];
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
if(a[i]==2)
{
a[i] =-1;
}
}
for(int i=1;i<=n;i++)
{
b[i]=b[i-1]+a[i];
if(a[i]==1)
{
c[i]=c[i-1]+1;
d[i]=d[i-1];
}
else
{
c[i]=c[i-1];
d[i]=d[i-1]+1;
}
}
for(int i=1;i<=n;i++)
{
f[i]=2147483640;
}
f[0]=0;
f[1]=1;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=i;j++)//>=0
{
int tmp=b[i]-b[j-1];
if(abs(tmp)<=m||abs(tmp)==i-j+1)
{
f[i]=min(f[i],f[j-1]+1);
}
}
//f[i]+=1;
}
printf("%d\n",f[n]);
return 0;
}