题目传送门
玄学真的不会。
解法:
f[i][j][k]表示第i位,k=0填B,k=1填W。
j=0表示一段长为K连续的B都没有。
j=1表示有一段长为K连续的B。
j=2表示有一段长为K连续的W。
因为要先有B是连续的才要W连续。
那么j=2肯定从j=1转移
保证连续的B后面一定有一个W,连续的W后有一个B,答案就是f[n+1][2][0]
假设这一位选B显然有
f[i][j][0]=f[i-1][j][1]+f[i-1][j][0]
if(i-k+1到i没有W)f[i][1][0]=f[i][1][0]+f[i-k][0][1];
然而这样会有重复,由于f[i][0][0]是乱转移,中间有可能已经有B了,所以:
if(i-k+1到i没有W)f[i][0][0]=f[i][0][0]-f[i-k][0][1];
代码实现:
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>