UVa 1633 Dyslexic Gollum

题目

◇题目传送门◆(由于UVa较慢,这里提供一份vjudge的链接)
◇题目传送门(vjudge)◆

题目大意

输入正整数N,KN,KN,K,求长度为NNN的01串中有多少个不含长度为至少为k" role="presentation" style="position: relative;">kkk的回文连续子串。答案对109+7109+710^9+7取模。

思路

若一个字符串包含一个长度为kkk的回文字符串,则它肯定包含一个长度为k−1" role="presentation" style="position: relative;">k−1k−1k-1的回文字符串。故我们在考虑第iii位时,只要这个字符串的前缀中不含有长度为k" role="presentation" style="position: relative;">kkk的回文子串,就可以考虑当前这一位是否满足条件,所以就能进行DP了。

定义状态f[i][j]f[i][j]f[i][j]为长度为iii的串最后K" role="presentation" style="position: relative;">KKK位为jjj时的串的个数。因为K" role="presentation" style="position: relative;">KKK较小,所以可以进行状态压缩。

但是,我们不能仅仅只考虑KKK的长度!!!例如:当i=3,j=011" role="presentation" style="position: relative;">i=3,j=011i=3,j=011i=3,j=011时,状态就有可能转移到i=4,j=0110i=4,j=0110i=4,j=0110。显然这是一个非法的状态!所以我们必须在递推时多考虑一位!!!

具体细节见代码。

正解代码

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;const int Mod=1000000007;
const int Maxn=400;
const int Maxk=10;int f[Maxn+1][1<<Maxk+3];
int N,K;
int bit[Maxk+5];
bool p[Maxk+3][1<<Maxk+3];bool Check(int x,int k) {int tmp[Maxk+5]={};int cnt=0;while(x) {tmp[cnt++]=x%2;x/=2;}for(int i=0;i<k/2;i++)if(tmp[i]!=tmp[k-i-1])return false;return true;
}//判断是否是回文子串int cal(int x,int y,int k) {if(x>=bit[k])x-=bit[k];return x<<1|y;
}//取出最后K位void Init() {bit[0]=0;bit[1]=1;for(int i=2;i<=Maxk+2;i++)bit[i]=bit[i-1]<<1;for(int i=1;i<Maxk+3;i++)for(int j=0;j<(1<<i);j++)if(Check(j,i))p[i][j]=true;//预先处理出长度为i,最后K位为j时是否是回文串
}int main() {#ifdef LOACLfreopen("in.txt","r",stdin);freopen("out.txt","w",stdout);#endifInit();int T;scanf("%d",&T);while(T--) {scanf("%d %d",&N,&K);if(K==1) {puts("0");continue;}//特判K=1!!memset(f,0,sizeof f);f[0][0]=1;for(int i=1;i<=N;i++)for(int j=0;j<(1<<min(i,K));j++) {if(!f[i-1][j])continue;for(int x=0;x<2;x++) {int tmp=cal(j,x,K);if(i>=K&&p[K][tmp])continue;//后K位是回文子串if(i>=K+1&&p[K+1][j<<1|x])continue;//后K+1位是回文子串f[i][tmp]=(f[i][tmp]+f[i-1][j])%Mod;}}int ans=0;for(int i=0;i<(1<<K);i++)ans=(ans+f[N][i])%Mod;printf("%d\n",ans);}return 0;
}

【UVa】【DP】1633 Dyslexic Gollum相关推荐

  1. UVA10074 Take the Land【最大子段和+DP】

    The poor man went to the King and said, "Lord, I cannot maintain my family. Please give me some ...

  2. Bailian2766 最大子矩阵【最大子段和+DP】

    最大子矩阵 总时间限制: 1000ms 内存限制: 65536kB 描述 已知矩阵的大小定义为矩阵中所有元素的和.给定一个矩阵,你的任务是找到最大的非空(大小至少是1 * 1)子矩阵. 比如,如下4 ...

  3. 51Nod-1051 最大子矩阵和【最大子段和+DP】

    1051 最大子矩阵和 基准时间限制:2秒 空间限制:131072KB 分值:40难度:4级算法题 一个M*N的矩阵,找到此矩阵的一个子矩阵,并且这个子矩阵的元素的和是最大的,输出这个最大的值. 例如 ...

  4. P5405 [CTS2019]氪金手游 【数学概率+树形dp】

    P5405 [CTS2019]氪金手游 [数学概率+树形dp] 先考虑外向树的情况: 这个的关键是要把求满足拓扑序的概率转化为求 每个点都比它的子树中的所有节点先取到的概率 .单个节点 xxx 的概率 ...

  5. HDU-5542-The Battle of Chibi【树状数组+dp】

    HDU-5542-The Battle of Chibi[树状数组+dp] Time Limit: 6000/4000 MS (Java/Others) Memory Limit: 65535/655 ...

  6. NUC1157 To the Max【最大子段和+DP】

    To the Max 时间限制: 1000ms 内存限制: 65536KB 通过次数: 1总提交次数: 1 问题描述 Given a two-dimensional array of positive ...

  7. BZOJ2131 免费的馅饼【线段树优化DP】

    Input 第一行是用空格隔开的二个正整数,分别给出了舞台的宽度W(1到10^8之间)和馅饼的个数n(1到10^5). 接下来n行,每一行给出了一块馅饼的信息.由三个正整数组成,分别表示了每个馅饼落到 ...

  8. loj 300 [CTSC2017]吉夫特 【Lucas定理 + 子集dp】

    题目链接 loj300 题解 orz litble 膜完题解后,突然有一个简单的想法: 考虑到\(2\)是质数,考虑Lucas定理: \[{n \choose m} = \prod_{i = 1} { ...

  9. 【尺取或dp】codeforces C. An impassioned circulation of affection

    http://codeforces.com/contest/814/problem/C [题意] 给定一个长度为n的字符串s,一共有q个查询,每个查询给出一个数字m和一个字符ch,你的操作是可以改变字 ...

最新文章

  1. 解决android unable to resolve new-instance问题
  2. sqlite--代码操作
  3. PCB的地与机壳(连接大地)为什么用阻容连接?
  4. 各种排序算法的JAVA实现
  5. 团队作业-Beta冲刺(周三)
  6. 使用Sidecar支持异构平台的微服务
  7. 爬虫 spider10——搭建elk平台,开发服务提供者
  8. 5G为何采纳华为力挺的Polar码?一个通信工程师的大实话
  9. 数据分析和大数据哪个更吃香_处理数据,大数据甚至更大数据的17种策略
  10. 链表的代码实现【数据结构F】
  11. java定义一个类显示没有_Java 中的每个类都至少有一个构造方法,一个类中如果没有定义构造方法,系统会自动为这个类创建一个默认的构造方法。_学小易找答案...
  12. 移动端开发——京东首页制作(流式布局)
  13. AI能让全球车厂每年多赚2150亿美元 | 麦肯锡报告
  14. chap8_2 Fresnel in OGRE
  15. 创建.NET Core程序的Nuget Package
  16. golang mysql批量插入实例
  17. 禅道linux客户端服务端,禅道11.0版本发布,主要集成禅道客户端
  18. POJ 有关动态规划的题目
  19. Cisco 交换机的操作
  20. 滴滴裁员 多一个月补偿反转苦情戏

热门文章

  1. 微机化远动系统与计算机网络,论计算机与电力系统自动化的有机结合
  2. 联想10年: 沽空不断,市值徘徊,10亿股先生为何叫不醒?
  3. 基于TCP的在线英文词典(使用了sqlite3数据库)
  4. uni-app使用picker底部弹起的滚动选择器(日期选择器)
  5. vue 手机端答题页面_从0开始,手把手教你用Vue开发一个答题App01之项目创建及答题设置页面开发...
  6. 基于Java的开源 Carrot2 搜索结果聚合聚类引擎
  7. 电商类应用如何快速构建站内搜索和智能推荐能力?
  8. hdu 校赛 玩骰子
  9. You got to put the past behind you before you can move on
  10. 视频播放器Mac Media Player Mac中文版