题意 :
输入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][j]==0){dp[i+2][j<<1]=0;dp[i+2][fills(j,1,i)]=0;}}}
}
// dp
else{if(dp[k][j]==0)continue;int statu=j<<1;if(dp[k+1][statu]!=0)// 末尾填0{int cnt=statu;if(cnt>=(1<<k))cnt-=(1<<k);if(dp[k][cnt]!=0)judge[i+1][cnt]=(judge[i+1][cnt]+judge[i][j])%MOD;}if(dp[k+1][statu|1]!=0){int cnt=statu|1;if(cnt>=(1<<k))cnt-=(1<<k);if(dp[k][cnt]!=0)judge[i+1][cnt]=(judge[i+1][cnt]+judge[i][j])%MOD;}}

全部代码如下

# include<iostream>
# include<cstdio>
# include<cstring>
# include<algorithm>
using namespace std;
const int MOD=1e9+7;
int judge[405][1<<12];// dp[i][j][k] 表示 前i位数 长度为j的后缀二进制表示为k的合法串有多少种
int dp[15][1<<12];// 判断数组 二进制状态表示为j 长度为i的串是否为回文子串
int fills(int j,int dig,int len)
{if(dig){return ((j<<1)+1)|(1<<(len+1));}else return j<<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][j]==0){dp[i+2][j<<1]=0;dp[i+2][fills(j,1,i)]=0;}}}
}
char str[100];
int main()
{init();int T;cin>>T;while(T--){int n,k;scanf("%d %d",&n,&k);memset(judge,0,sizeof judge);int ans=0;judge[1][0]=judge[1][1]=1;for(int i=1;i<=n;i++){int top=1<<min(i,k);for(int j=0;j<top;j++){//printf("judge[%d][%d]=%d\n",i,j,judge[i][j]);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;}else{if(dp[k][j]==0)continue;int statu=j<<1;if(dp[k+1][statu]!=0)// 末尾填0{int cnt=statu;if(cnt>=(1<<k))cnt-=(1<<k);if(dp[k][cnt]!=0)judge[i+1][cnt]=(judge[i+1][cnt]+judge[i][j])%MOD;}if(dp[k+1][statu|1]!=0){int cnt=statu|1;if(cnt>=(1<<k))cnt-=(1<<k);if(dp[k][cnt]!=0)judge[i+1][cnt]=(judge[i+1][cnt]+judge[i][j])%MOD;}}if(i==n)ans=(judge[i][j]+ans)%MOD;}}cout<<ans<<endl;}
}

UVA 1633-Dyslexic Gollum 状态压缩DP相关推荐

  1. UVA - 1633 Dyslexic Gollum 状态压缩

    问题 输入N,K(N<=400,K<=10),求长度为N且不含有长度至少为K的连续回文子串的01字符串有多少个? 分析 输入k,要判断k,k+1的情况,因为一个字符串有长度为k的回文子串, ...

  2. UVA 1633 Dyslexic Gollum (状压dp)

    分析:dp[i][j]表示当前为i长度,长度为k的后缀状态,有多少个串.考虑一下k和k+1长度的串是否为回文串即可 代码: #include <iostream> #include < ...

  3. UVa 1633 Dyslexic Gollum(状压DP)

    题意 求有多少长度等于N(N≤400)N(N\leq 400)N(N≤400)的∑={0,1}\sum = \{0,1\}∑={0,1}字符串里面不包含长度大于等于k(k≤10)k(k \leq 10 ...

  4. UVA 1633 Dyslexic Gollum

    有一定难度的一道动态规划的题目.这个题目首先计算palindrom[i][j],其中i表示对应的数据的位数,j表示相应的数据,palindrom[i][j]中记录的就是i位二进制位表示的数据j是否为回 ...

  5. 【UVa】【DP】1633 Dyslexic Gollum

    UVa 1633 Dyslexic Gollum 题目 ◇题目传送门◆(由于UVa较慢,这里提供一份vjudge的链接) ◇题目传送门(vjudge)◆ 题目大意 输入正整数N,KN,KN,K,求长度 ...

  6. 0x56. 动态规划 - 状态压缩DP(习题详解 × 7)

    目录 Problem A. 最短Hamilton路径 ProblemB. 蒙德里安的梦想 Problem C. Corn Fields Problem D. 小国王 Problem E. 炮兵阵地 P ...

  7. POJ 2411 Mondriaan‘s Dream(最清楚好懂的状压DP讲解)(连通性状态压缩DP)

    poj 2411 Mondriaan's Dream(最清晰的状压DP解析) 闫氏DP大法好 我们这里是一列一列地来,因为是一个棋盘性的状态压缩DP,从哪个方向都一样 摆放的小方格总方案数 等价于 横 ...

  8. BZOJ1688|二进制枚举子集| 状态压缩DP

    Disease Manangement 疾病管理 Description Alas! A set of D (1 <= D <= 15) diseases (numbered 1..D) ...

  9. hdu1074 状态压缩dp+记录方案

    题意:       给你一些作业,每个作业有自己的结束时间和花费时间,如果超过结束时间完成,一天扣一分,问你把n个作业完成最少的扣分,要求输出方案. 思路:       状态压缩dp,记录方案数的地方 ...

最新文章

  1. GBDT与XGBoost区别与联系 GBDT近些年来更因为被用于构建搜索排序的机器学习模型而引起广泛的关注
  2. python 求和为正整数n的连续整数序列
  3. Python生成器主要用法
  4. pycryptodom的源码安装
  5. python转cython_Cython 0.23 发布 Python 的 C 语言扩展
  6. mysql怎样修改my ini_mysql通过修改my.ini设置系统变量
  7. boost::variant2模块实现复制分配的测试程序
  8. boost::contract模块实现sqrt的测试程序
  9. scrapy从入门到放弃 学习项目2
  10. [转] CPU GPU TPU
  11. 面试系列-Java面试总则
  12. 字符串拼接之+=和join()的比较
  13. 盘点那些不为大众所知,却暗地里很“牛逼”的软件
  14. cout 和printf的区别,输出不同
  15. Day527528529.图灵学院之面试题③ -面经
  16. 2020年最新WorldFirst注册图文教程(0.3%提现费)
  17. 迅睿cms 项目信息自定义字段调用
  18. git切换分支时,如何干净的切换到另一个分支上?
  19. 不知道自己该做啥?我该咋办
  20. jfinal 生成实体类

热门文章

  1. Zano:迷你无人飞行摄影机
  2. 你什么档次?敢和我用一样的即时通讯平台WorkPlus?
  3. VASP6.3.2中VTST插件的编译
  4. 辽宁移动数码Q5_S905M_EMMC_线刷固件包
  5. kiel实现c语言编程,Kiel 软件的使用和简单C程序调试
  6. css 金额千位符,css3 - 使用C格式化数字(小数位,千位分隔符等)
  7. 2021-2027全球及中国半导体掩膜版行业研究及十四五规划分析报告
  8. OJ每日一练——配对碱基链
  9. java标识符区分大小写_java标识符区分大小写怎么区分?Java入门教程
  10. C++之依赖倒置原则