有一定难度的一道动态规划的题目。这个题目首先计算palindrom[i][j],其中i表示对应的数据的位数,j表示相应的数据,palindrom[i][j]中记录的就是i位二进制位表示的数据j是否为回文,如果为回文,那么对应的为true,否则对应的为false。在这样一个初始化结束之后,就开始进行动态规划的过程,dp[i][j]表示的是前面i位中最后的k位表示的状态为j时合法串的个数,对状态进行相应的更新即可,具体实现见如下代码:

#include<iostream>
#include<vector>
#include<string>
#include<set>
#include<stack>
#include<queue>
#include<map>
#include<algorithm>
#include<cmath>
#include<iomanip>
#include<cstring>
#include<sstream>
#include<cstdio>
#include<deque>
using namespace std;#define MOD 1000000007
const int MAX = (1 << 11) + 10;typedef long long LL;
bool palindrom[12][MAX];
LL dp[405][MAX];class Solve{
public:int bit[13];int n, k;void Init(){memset(palindrom, false, sizeof(palindrom));palindrom[1][0] = true;palindrom[1][1] = true;bit[0] = 0;bit[1] = 1;for (int i = 2; i < 13; i++) bit[i] = bit[i-1] << 1;for (int i = 2; i <= 11; i++){int half = i / 2;int up = (1 << half) - 1;for (int j = 0; j <= up; j++){int temp = j;int R = 0;for (int j = 1; j <= half; j++) R = (R << 1) + (temp & 1), temp >>= 1;if (i & 1){//总位数为奇数位palindrom[i][(j << 1) << half | R] = true;palindrom[i][(j << 1 | 1) << half | R] = true;}else{//总位数为偶数位palindrom[i][j << half | R] = true;}}}}int Cal(int j,int i){if (j >= bit[k]) j -= bit[k];return j << 1 | i;}void Deal(){memset(dp, 0, sizeof(dp));dp[0][0] = 1;LL ans = 0;int up = (1 << k) - 1;for (int i = 1; i <= n; i++){  for (int j = 0; j <= up; j++){if (dp[i - 1][j] == 0) continue;for (int x = 0; x <= 1; x++){int state = Cal(j, x);if (i >= k&&palindrom[k][state]) continue;if (i >= k + 1 && palindrom[k + 1][j << 1|x]) continue;dp[i][state] += dp[i - 1][j];dp[i][state] = dp[i][state] % MOD;}}}for (int j = 0; j <= up; j++){ans = (ans + dp[n][j]) % MOD;}cout << ans << endl;}
};int main(){int T;cin >> T;Solve a;a.Init();while (T--){cin >> a.n >> a.k;a.Deal();}return 0;
}

UVA 1633 Dyslexic Gollum相关推荐

  1. UVA 1633 Dyslexic Gollum (状压dp)

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

  2. 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 ...

  3. UVA - 1633 Dyslexic Gollum 状态压缩

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

  4. 【UVa】【DP】1633 Dyslexic Gollum

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

  5. Dyslexic Gollum

    题意: 求长度是n的二进制串中,不含长度大于等于k的回文串的个数 分析: dp[i][j][k]表示长度i,后11位状态是j不含长度大于等于k的回文串的个数(因为k最大是10,所把后11位状态压缩,d ...

  6. 禁止的回文子串 Dyslexic Gollum

    UVA1633 一个长的回文串都可以由短的回文串拓展而来,只要短的回文在左右两端增加相同的字符即可.因此,在考虑长度为NNN的01串时,只要在从长度为1向NNN拓展的过程中,保证后KKK个字符不是回文 ...

  7. 【题解】UVA1633:Dyslexic Gollum

    @vjudge 只要保证不出现长度为kkk或k+1k+1k+1的回文串就可以 状压保存最后kkk位的状态,每次转移时判断一下是否合理就好了 Code: #include <bits/stdc++ ...

  8. SPOJ AMR12E Dyslexic Gollum

    AC自动机+DP.题目要求是生成一个长度为n的 0-1 串,其中最长回文子串的长度小于 k ( 1 <= k <= 10).因为k长度只有10,所以我们可以先预处理出长度小于11的所有回文 ...

  9. SPOJ AMR12E Dyslexic Gollum 解题报告

    题目 Summer Training 06 - Amritapuri 2012 总结 题意: 在所有长度为n的01串中,不包含长度大于等于K的回文字串的串有多少个. 题解: 注意到K非常小,所以可以用 ...

最新文章

  1. 数据库命名规则(转)
  2. C# 线程同步之排它锁/Monitor监视器类
  3. python模块time_Python模块:time模块详解(转)
  4. 【Java】不正当使用break语句的危害
  5. 双系统windows10扩容ubuntu16.04
  6. linux mod_ssl源码安装,linux下不重新编译apache添加安装mod_ssl模块和错误的处理方法...
  7. Bootstrap补充
  8. 北师大高级程序c语言,北师大《高级程序设计C语言》.doc
  9. matlab network_无所不能的 MATLAB
  10. 运筹优化(七)--动态规划解析
  11. [RK3399][Android7.1] Display系统中的DRM模块介绍
  12. 实现高效的英文单词前缀匹配
  13. 打字母案例完整版(C#)
  14. js的变量命名需要遵循什么规则?
  15. IIC 通信协议 (二)
  16. 看完这五个问题后你真的了解C语言吗?(深度剖析C语言第二期)
  17. 圆桌骑士 图的连通性
  18. java 过滤关键字 自定义字典库
  19. LaTex各种命令、符号
  20. 微信公众平台不应是自媒体唯一的内容输出来源

热门文章

  1. 7-19 定义一个Time类分数 20
  2. amd处理器更新zen4服务器芯片,AMD将推出64 核心Zen 4处理器,整体性能提升了40%...
  3. Word控件Spire.Doc 【文本】教程(11) ;如何将文本分成两列并在它们之间添加行
  4. Python +selenium+unittest+ddt数据化实现自动化运行和脚本并生成报告
  5. 什么时候需要@RequestBody注解
  6. python+opencv虚化边缘
  7. MFC或C/C++中如何判断目录存在,文件/文件夹存在,亦或是文件夹存在,文件存在
  8. 量子逻辑门之受控Y门(C-Y)
  9. 开源虚拟打印机ImagePrinter
  10. es - elasticsearch自定义分析器 - 内建分词过滤器 - 10