题意
给你一个只由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. java easyui tree例子_EasyUI Tree的简单使用
  2. 理解透彻--802.1d,802.1w,802.1s与802.1q
  3. libevent mysql_在 libevent 中使用 MariaDB(MySQL)
  4. 邁向IT專家成功之路的三十則鐵律 鐵律十四:IT人言談之道-守中
  5. Memcached深度分析【转载】
  6. linux mysql 性能提高,高手心得:提高MySQL性能的方法
  7. spring 3.0 应用springmvc 构造RESTful URL 详细讲解
  8. 也谈Oracle异常: ORA-06502: PL/SQL: 数字或值错误 : 字符串缓冲区太小
  9. 【eclipse】启动不了报错java was started but returned exit code=13
  10. 漏洞C:/Windows/Fonts/csrss.exe文件找不到简单查找方法
  11. 液压传动与气动技术【1】
  12. Introduction to Wireless LAN Measurements From 802.11a to 802. 11 ac
  13. PostgreSQL DBA(63) - Extension(pg_stat_statements)
  14. 20190401每周精品之认知
  15. 算法(Java)——双指针
  16. 在ENSP中配置DHCP服务器
  17. linux抓包查对方的mac地址,1.根据MAC地址抓包
  18. Dell R720xd服务器装机暨改造过程
  19. 2021年我的21个感悟(1/3)
  20. 音视频基础:音频(PCM和AAC)

热门文章

  1. web前端——h标签
  2. 密码指纹锁静电测试案例
  3. HTML(十二)三种常见布局:三栏式布局 双飞翼布局 圣杯布局
  4. 单相PWM逆变器的建模-非常基础的建模文章 讲的也很细致
  5. 将cityscapes数据集转换为19类 convert cityscapes to 19 categories
  6. 使用opencv-python对图片进行球面投影
  7. 【pytorch】——torch.hub
  8. ajax nginx 转发 sessionid_Nginx:初识Nginx(概念、在Docker中安装Nginx、常用命令、配置文件) - 怀梦想,致远方...
  9. tableau 集动作_集动作
  10. matlab指数平滑参数,三次指数平滑——matlab实现