题意
一个长为n的01串,翻转多少次能满足 1 周期出现,如k = 3时,“00010010”, “1001001”, “00010” and "0"满足要求
分析
可以看出最后转换出的串满足是这样的,前面后面一部分零,中间是循环串,设dp[ i ]为使1 ~ i 部分满足要求且i位置为1的最小步数,有两种转移状态,一种是该位置填1且前面全填0,另一种是和i - k 连接构成循环串,计算ans的时候算上后面全是0即可
代码
char s[MX];
int dp[MX],pre[MX];
int solve()
{
int n,k;cin>>n>>k>>(s+1);
rpp(i,n) pre[i]=pre[i-1]+(s[i]-'0');
if(pre[n]<=1) return 0;
int ans=pre[n]-1;
rpp(i,n)
{
dp[i]=pre[i-1]+(s[i]=='0'?1:0);
if(i>k) dp[i]=min(dp[i-k]+pre[i-1]-pre[i-k]+(s[i]=='0'?1:0),dp[i]);
ans=min(ans,dp[i]+pre[n]-pre[i]);
}
return ans;
}
signed main()
{
int T = 1;cin>>T;
while (T--)
cout<<solve()<<endl;
return 0;
}