题意 :
输入n和k 求出长度为n的01串中有多少个不含长度至少为K的回文连续子串。
思路:
没有思路 看题解照着敲的。。。
首先 长的回文串由短的回文串构成,那么我们只需要避免构造的字符串出现长度为k和k+1的回文字符串就好了。
题目说的是01串 回文串长度最大是10 那么肯定是要用到状压DP的。
定义 dp[i][j] 表示长度为i的字符串后k位的二进制表示为j的合法字符串有多少个
分情况进行转移 i < k时
if(i<k)
{
judge[i+1][j<<1]=(judge[i+1][j<<1]+judge[i][j])%MOD;
judge[i+1][j<<1|1]=(judge[i+1][j<<1|1]+judge[i][j])%MOD;
}
k<=i时 我们就有些麻烦了 我们要考虑j表示的串是否是回文串 j后面填上0或1后是否是回文串 每次都单独判断的话很耗时间 我们可以预处理一下
void init()
{
memset(dp,-1,sizeof dp);
dp[1][1]=0;
dp[1][0]=0;
dp[2][0]=dp[2][3]=0;
for(int i=1; i<=11; i++)
{
int top=1<<i;
for(int j=0; j<top; j++)
{
if(dp[i][