题意
给你一个只由AGCT组成的字符串S(|S|≤15),对于每个1≤i≤|S|
询问有多少个只由AGCT组成的长度为m(1≤m≤1000)的字符串T,使得LCS(S,T)=i。
|S|<=15. m<= 1000$


暴力显然就是2^m枚举,然后求lcs.
假设求lcs的dp数组为g[i][j]。
那么我们就把g[i]看成一个序列g[i][0],g[i][1],g[i][2],g[i][3]….
我们可以考虑表示出这个序列的状态。f[i][S]表示T的前i位与S的lcs的状态为“序列S”的方案数。但很显然我没不能直接表示这个状态。
很容易发现他们的差值不超过1.这个也很好证明。那么我们把序列差分一下,就是这就是个01的了!我们就可以开开心心的状压了!


#include<cstdio>
#include<algorithm>
#include<cstring>
#define lowbit(x) ((x)&-(x))
const int P = 1e9 + 7;using namespace std;
int _S[1 << 15][4], f[1001][1 << 15], n, m, bitc[1 << 15], ans[1 << 15], g[1001], _g[1001];
char s[18];void up (int &A, int B) { A += B; if (A >= P) A -= P; }int idx (char t) {if (t == 'A') return 0;if (t == 'C') return 1;if (t == 'G') return 2;return 3;
}void Solve () {scanf ("%s%d", s, &m); n = strlen (s); int S = (1 << n);memset (f, 0, sizeof f);memset (ans, 0, sizeof ans);// O (4 * n * 2 ^ n)for (int j = 0; j < S; ++j) {g[0] = j & 1; for (int i = 1; i < n; ++i) g[i] = g[i - 1] + (j >> i & 1);for (int k = 0; k < 4; ++k) {_g[0] = g[0] | (idx (s[0]) == k);for (int i = 1; i < n; ++i) _g[i] = g[i];for (int i = 1; i < n; ++i) if (idx (s[i]) == k && _g[i] < g[i - 1] + 1) _g[i] = g[i - 1] + 1;for (int i = 1; i < n; ++i) if (_g[i - 1] > _g[i]) _g[i] = _g[i - 1];for (int i = n - 1; i; --i) _g[i] -= _g[i - 1];for (int i = n - 2; ~i; --i) _g[i] = _g[i + 1] << 1 | _g[i];_S[j][k] = _g[0];}}f[0][0] = 1;for (int i = 0; i < m; ++i) // O (4 * m * 2 ^ n)for (int j = 0; j < S; ++j)for (int k = 0; k < 4; ++k)up (f[i + 1][_S[j][k]], f[i][j]);ans[bitc[0] = 0] = f[m][0];for (int i = 1; i < S; ++i) up (ans[bitc[i] = bitc[i - lowbit (i)] + 1], f[m][i]);for (int i = 0; i <= n; ++i) printf ("%d\n", ans[i]);
}void IO () {freopen ("3864.in", "r", stdin);freopen ("3864.out", "w", stdout);
}int main () {
//  IO ();int T;scanf ("%d", &T);while (T--) Solve ();return 0;
}

[BZOJ 3864][HDU 4899]Hero meet devil(DP套DP)相关推荐

  1. HDU 4899 Hero meet devil (状压DP, DP预处理)

    题意:给你一个基因序列s(只有A,T,C,G四个字符,假设长度为n),问长度为m的基因序列s1中与给定的基因序列LCS是0,1......n的有多少个? 思路:最直接的方法是暴力枚举长度为m的串,然后 ...

  2. HDU 4899 Hero meet devil

    题意:一段DNA序列s,只包含字符ATGC,长度不超过15,求有多少种长度为n的DNA序列与s的最长公共子序列长度为0~len. 解法:状压dp. LSC: if(a[i] == b[j]) dp[i ...

  3. bzoj 3864: Hero meet devil [dp套dp]

    3864: Hero meet devil 题意: 给你一个只由AGCT组成的字符串S (|S| ≤ 15),对于每个0 ≤ .. ≤ |S|,问 有多少个只由AGCT组成的长度为m(1 ≤ m ≤ ...

  4. BZOJ 3864: Hero meet devil (从dp性质实现dp套dp)

    题意:求长度为m的,字符集大小为4的,字符串,中,与字符串S(|S|<=15)的最长公共子序列长度=i的字符串数量.i∈0→∣S∣i \ \in 0 \to |S|i ∈0→∣S∣ 发现这个状态 ...

  5. BZOJ3864 hero meet devil

    题目链接:https://darkbzoj.cf/problem/3864 这个是DP套DP的典型例题. 常规LCS的求法: 设dp[i][j]表示到a[i],b[j]的LCS. 那么if \(a[i ...

  6. hdu4899 Hero meet devil

    题目链接 题意 给出一个长度字符串\(T\),其中只包含四种字符\((A,C,G,T)\),需要找一个字符串\(S\),使得\(S\)的长度为\(m\),问\(S\)和\(T\)的\(lcs\)为\( ...

  7. [XSY] 相似(DP套DP)

    相似 在看这道题前,有必要先看一下DP套DP的入门题[uoj3864]Hero meet devil,附上两篇写得不错的题解: https://blog.csdn.net/Ike940067893/a ...

  8. dp套dp(动态规划)

    dp套dp 这是一个对于一类动态规划的计数问题的处理方法,问题常常是如果形式确定就可以直接dp,但是现在却要求满足某个要求的所有方案数,一般的处理方法就是一维负责增量构造,其他维度用来表示内部dp状态 ...

  9. hdu4899 dp套dp

    题意:只含字母ATGC,  给定一个S串,长度小于等于15,构造满足LCS(S,T)=X的T串,求这样的T串的个数,0<=X<=|S| 网上有一堆题解,但大多数都讲得根本让人无法理解 以下 ...

最新文章

  1. 去除网页上超链接的下划线
  2. tensorflow 进阶 五 ---TensorFlow conv2d原理及实践
  3. C# 什么是【事件驱动】
  4. C++中的各种预处理的表示
  5. matlab可以使用词云分析吗,利用豆瓣短评数据生成词云
  6. Java命令:jstack — 获取线程dump信息
  7. java character类
  8. 总结之前有道笔记的内容--对于postdelay方法的讲解
  9. java上课签到如何写_java签到程序怎么设置?学生考勤程序怎么写?
  10. Redis面试题汇总(附答案),面试突击专用
  11. vue项目下,webpack.js/package.json配置
  12. 《SQL必知必会阅读思维导图》PART1
  13. java工程师中兴面试题
  14. 视频、音频格式转换全集
  15. CountDownTimer 倒计时器
  16. Neo4j图数据库高级应用系列 / 服务器扩展指南 APOC - apoc.periodic.iterate()过程在4.0版本中的重大变化
  17. 蒙特利尔大学科研工作者:详细对比人类视觉系统与卷积神经网络(CNN)的联系和区别...
  18. 【软考】 5 计算机网络
  19. 微信登陆的LOL只有一个服务器,LOL:新功能!部分大区开放了微信登录功能,网友:有啥用?...
  20. 设计模式——状态模式、观察者模式(行为型模式)

热门文章

  1. 计算机组成原理——运算器实验
  2. 军工保密资质认定的条件
  3. STM32微控制器综合实训12 单相并网逆变器SPWM发生器
  4. ROSwiki更正 — 创建ROS消息和ROS服务
  5. 虚幻引擎(8)-射击准星
  6. 挂在网盘到本地磁盘(以中移动云盘为例)
  7. codeup3688 行礼托运
  8. 浏览器安装Vue devtools
  9. commonmark使用教程
  10. Win10系统为什么又提示重装打印机驱动?