解题思路,就是对于每个k值,求其最小的移动次数m,然后比较大小,取其最小值。而对于某个特定的K,就是从头到尾检查序列,如果此时是B就对其反转(同时影响后面的k-1个),到最后,扫描到倒数第k+1个完毕,最后只剩下k个,要不都是B全部反转,要不全是F(不用反转),如果出现其它情况,那么反转k个,不能使序列全部变成F。
#include<stdio.h>
#define N 5050
int T;//序列长度
int dir[N];//把字符转化成数字
int f[N];
int cal(int k)
{
int res,sum,i;
memset(f,0,sizeof(f));
res=0;
sum=0;
for(i=0;i+k<=T;i++)
{
if((dir[i]+sum)%2!=0)
{
res++;
f[i]=1;
}
sum+=f[i];
if(i-k+1>=0)
sum-=f[i-k+1];
}
for(i=T-k+1;i<T;i++)
{
if((dir[i]+sum)%2!=0)
{
return -1;
}
if(i-k+1>=0)
sum-=f[i-k+1];
}
return res;
}
int main(void)
{
char ch;
int i,K=1,M,m,k;
scanf("%d",&T);
M=T;
getchar();
for(i=0;i<T;i++)
{
scanf("%c",&ch);
if(ch=='B')
dir[i]=1;
else
dir[i]=0;
getchar();
}
for(k=1;k<=T;k++)
{
m=cal(k);
if(m>=0&&M>m)
{
M=m;
K=k;
}
}
printf("%d %d\n",K,M);
}