uva 1633 Dyslexic Gollum
题意:
给出n和k,求出长度为n的不包含长度大于等于k的回文串的01字符串的个数。
思路:
如果一个字符串包含长度为k的回文串,那么它肯定包含长度为k-1的回文串,所以考虑第i位的时候,只要前缀中不包含长度为k的回文串,就只需要考虑这一位使其满足条件,所以就可以进行递推dp了。
设dp[i][j]为长度为i的字符串且最后k位为j时满足的串的个数,因为k较小,所以可以进行状态压缩。
但是考虑k的长度是不行的,还需要考虑k+1才行,比如k = 4,j为0010,那么转移就可以转移到00100,后四位虽然满足,但是这5位显然是个回文串,所以需要考虑多一位。
首先预处理出长度为i,状态为j时是否时回文串。
bit数组用于保存2的i-1次方,即bit[i] = 2^(i-1)。
cal用于计算当前的最后k位。
代码:
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int N = ;
const int K = ;
const int mod = 1e9 + ;
bool pal[K][<<K];
int bit[K];
int dp[N][(<<K)];
bool check(int x,int k)
{
int b[K];
memset(b,,sizeof(b));
int cnt = ;
while (x)
{
b[cnt++] = x % ;
x /= ;
}
for (int i = ;i < k/;i++)
{
if (b[i] != b[k - i - ]) return ;
}
return ;
}
int cal(int x,int y,int k)
{
if (x >= bit[k]) x -= bit[k];
return x << | y;
}
int main()
{
bit[] = ;
bit[] = ;
for (int i = ;i < K;i++) bit[i] = bit[i-] << ;
for (int i = ;i < K;i++)
{
for (int j = ;j < (<<i);j++)
{
if (check(j,i)) pal[i][j] = ;
}
}
int t;
scanf("%d",&t);
while (t--)
{
int n,k;
scanf("%d%d",&n,&k);
if (k == )
{
puts("");
continue;
}
memset(dp,,sizeof(dp));
dp[][] = ;
for (int i = ;i <= n;i++)
{
for (int j = ;j < ( << min(i,k));j++)
{
if (!dp[i-][j]) continue;
for (int x = ;x < ;x++)
{
int sta = cal(j,x,k);
if (i >= k && pal[k][sta]) continue;
if (i >= k + && (pal[k+][j<<|x])) continue;
dp[i][sta] += dp[i-][j];
dp[i][sta] %= mod;
}
}
}
int ans = ;
for (int i = ;i < (<<k);i++)
{
ans += dp[n][i];
ans %= mod;
}
printf("%d\n",ans);
}
return ;
}
/*
3 2 2 3 3 3 4
*/
uva 1633 Dyslexic Gollum的更多相关文章
- 【Uva 1633】Dyslexic Gollum
[Link]: [Description] 输入正整数n和k(1≤n≤400,1≤k≤10),求长度为n的01串中有多少个不含长度至少 为k的回文连续子串.例如,n=k=3时只有4个串满足条件:001 ...
- Dyslexic Gollum
题意: 求长度是n的二进制串中,不含长度大于等于k的回文串的个数 分析: dp[i][j][k]表示长度i,后11位状态是j不含长度大于等于k的回文串的个数(因为k最大是10,所把后11位状态压缩,d ...
- uva 1354 Mobile Computing ——yhx
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABGcAAANuCAYAAAC7f2QuAAAgAElEQVR4nOy9XUhjWbo3vu72RRgkF5
- UVA 10564 Paths through the Hourglass[DP 打印]
UVA - 10564 Paths through the Hourglass 题意: 要求从第一层走到最下面一层,只能往左下或右下走 问有多少条路径之和刚好等于S? 如果有的话,输出字典序最小的路径 ...
- UVA 11404 Palindromic Subsequence[DP LCS 打印]
UVA - 11404 Palindromic Subsequence 题意:一个字符串,删去0个或多个字符,输出字典序最小且最长的回文字符串 不要求路径区间DP都可以做 然而要字典序最小 倒过来求L ...
- UVA&&POJ离散概率与数学期望入门练习[4]
POJ3869 Headshot 题意:给出左轮手枪的子弹序列,打了一枪没子弹,要使下一枪也没子弹概率最大应该rotate还是shoot 条件概率,|00|/(|00|+|01|)和|0|/n谁大的问 ...
- UVA计数方法练习[3]
UVA - 11538 Chess Queen 题意:n*m放置两个互相攻击的后的方案数 分开讨论行 列 两条对角线 一个求和式 可以化简后计算 // // main.cpp // uva11538 ...
- UVA数学入门训练Round1[6]
UVA - 11388 GCD LCM 题意:输入g和l,找到a和b,gcd(a,b)=g,lacm(a,b)=l,a<b且a最小 g不能整除l时无解,否则一定g,l最小 #include &l ...
- UVA - 1625 Color Length[序列DP 代价计算技巧]
UVA - 1625 Color Length 白书 很明显f[i][j]表示第一个取到i第二个取到j的代价 问题在于代价的计算,并不知道每种颜色的开始和结束 和模拟赛那道环形DP很想,计算这 ...
随机推荐
- mongo 的简单查询语法
小白的我对MONGO的一些语句搜集用于区别mysql及一些小常识 pymongo 语法按照id进行倒序操作db.news.find().limit(20).sort([("_id" ...
- ELKstack5.6.5
ELKstack 安装: 一:环境准备: 1.给添加块磁盘50G,相当于模拟raid 2.分别给它们做本机的主机解析 [root@node01 ~ ]#cat /etc/hosts 127.0.0. ...
- 【Python全栈-JavaScript】JavaScript入门
JavaScript基础知识点 一.JavaScript概述 参考:http://www.w3school.com.cn/b.asp JavaScript的历史 1.1992年Nombas开发出C-m ...
- Python中Mock的示例(转)
原文:https://segmentfault.com/a/1190000008753754 一些常用的mock示例 先简单定义个类,方便举例: class Person: def __init__( ...
- IntelliJ IDEA Ultimate 下载与安装
一.下载 Intellij IDEA Ultimate 下载链接:https://www.jetbrains.com/idea/download/#section=windows 1.进入官网点击Ul ...
- 【托业】【新托业TOEIC新题型真题】学习笔记12-题库八-P7
155.political figure 政治人物 prominent 160.association n.协会,社团; 联合,联系; 联想; rarely adv.很少地; 罕有地; 极精彩地; 珍 ...
- Linux学习和ROS安装(1)
参考文档:https://www.cnblogs.com/liu-fa/p/5779206.html#undefined 系统环境:Window7 64bit+VMware11 ubuntu-gnom ...
- MRPT编译
今天尝试编译一下MRPT,主要是为了学习里面的路径规划算法. 自主探索,未知环境探索...... 编译的过程中遇到一个问题就是wxWidgets老是检测不到,让我添加它的root目录.明明wxWidg ...
- golang 删除用go get 安装的package
下面这两种方法都需要手动删除package的源码目录. 1.手动删除 It's safe to just delete the source directory and compiled packag ...
- solr整合spring
<!-- 单机版solr服务配置 --> <!-- <bean id="httpSolrServer" class="org.apache.sol ...