题意:给你一个基因序列s(只有A,T,C,G四个字符,假设长度为n),问长度为m的基因序列s1中与给定的基因序列LCS是0,1......n的有多少个?

思路:最直接的方法是暴力枚举长度为m的串,然后再用求LCS的dp。当然我们可以在枚举的时候同时进行dp,但是复杂的仍然为O(4 ^ m)。我们可以观察求LCS 的状态转移方程:dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]) 若s[i] == s1[j] dp[i][j] = max(dp[i - 1][j - 1] + 1)。可以发现,每一行的相邻的状态最多只会差1,那么我们可以用差分的方法转化为状压dp。剩下的部分这两篇博客讲的很清楚了:https://www.cnblogs.com/RabbitHu/p/BZOJ3864.html, https://www.cnblogs.com/owenyu/p/6724616.html

代码:

#include <bits/stdc++.h>
#define LL long long
using namespace std;
const LL mod = 1000000007;
const int maxn = 1010;
char mp[4] = {'A', 'T', 'C', 'G'};
int ans[20];
int dp[2][1 << 15];
int trans[1 << 15][4], cnt[1 << 15];
char s[maxn];
void init(int n) {int pre[20], cur[20];memset(pre, 0, sizeof(pre));memset(cur, 0, sizeof(cur));for (int i = 0; i < (1 << n); i++) {if(i)cnt[i] = cnt[i >> 1] + (i & 1);pre[0] = i & 1;for (int j = 1; j < n; j++)pre[j] = pre[j - 1] + (i >> j & 1); for (int k = 0; k < 4; k++) {int now = 0;cur[0] = pre[0];if(mp[k] == s[0]) cur[0] = 1;now |= cur[0];for (int j = 1; j < n; j++) {cur[j] = max(cur[j - 1], pre[j]);if(mp[k] == s[j]) {cur[j] = max(cur[j], pre[j - 1] + 1);}now |= ((cur[j] - cur[j - 1]) << j);}trans[i][k] = now;}}
}
int main() {int T, m, n;scanf("%d", &T);while(T--) {scanf("%s", s);scanf("%d", &m);int n = strlen(s);init(n);memset(dp, 0, sizeof(dp));memset(ans, 0, sizeof(ans));dp[0][0] = 1;    for (int i = 1; i <= m; i++) {memset(dp[i & 1], 0, sizeof(dp[i & 1]));int pre = (i & 1) ^ 1;int now = i & 1;for (int j = 0; j < (1 << n); j++) {for (int k = 0; k < 4; k++) {dp[now][trans[j][k]] = (dp[pre][j] + dp[now][trans[j][k]]) % mod;}}}  for (int i = 0; i < (1 << n); i++)ans[cnt[i]] = (ans[cnt[i]] + dp[m & 1][i]) % mod;for(int i = 0; i <= n; i++)printf("%d\n", ans[i]); }
}

  

转载于:https://www.cnblogs.com/pkgunboat/p/10440763.html

HDU 4899 Hero meet devil (状压DP, DP预处理)相关推荐

  1. [BZOJ 3864][HDU 4899]Hero meet devil(DP套DP)

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

  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. HDU 4336 Card Collector(状压 + 概率DP 期望)题解

    题意:每包干脆面可能开出卡或者什么都没有,一共n种卡,每种卡每包爆率pi,问收齐n种卡的期望 思路:期望求解公式为:$E(x) = \sum_{i=1}^{k}pi * xi + (1 - \sum_ ...

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

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

  5. #3864. Hero meet devil dp套dp + 状压 + 状态机

    传送门 文章目录 题意: 思路: 题意: 给你一个只包含ACGTACGTACGT的串sss,再给你一个mmm,第iii行输出有多少个长度为mmm且只包含ACGTACGTACGT的串与sss的lcslc ...

  6. HDU 5691 Sitting in Line 状压dp

    Sitting in Line 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5691 Description 度度熊是他同时代中最伟大的数学家,一切 ...

  7. 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∣ 发现这个状态 ...

  8. HDU 3001 Travelling (三进制状压dp)

    题意 n(n<=10)n(n个城市,知道每个城市间的旅行费用,但每个城市最多走两遍.问最小花费是多少 . 也就是每个城市可以走两次的tsp问题. 分析 最多走两次,三进制0 1 2可满足,即用三 ...

  9. bzoj4565 [HAOI2016]字符合并 结论+状压+区间dp

    如果k==2的话就是记搜, 但这个题用记搜的思路的话是需要枚举k个断点的, 所以对于枚举断点,就很可能有优化,比如到一个断点,一个决策的最优值 于是考虑区间dp模型,相当于是插入一个数,然后看影响. ...

最新文章

  1. python里保存图片_python保存图片报错?
  2. 白话详细解读(七)----- Batch Normalization
  3. Facebook 中国程序员之死
  4. 习题2-3 求平方与倒数序列的部分和
  5. 部署Nginx服务器
  6. 笨办法学 Python · 续 练习 32:扫描器
  7. SpringBoot 操作 Redis的各种实现(以及Jedis、Redisson、Lettuce的区别比较)
  8. 2748: [HAOI2012]音量调节
  9. Excel导入导出帮助类
  10. 猎洞高手轻松变身Gsuite 超级管理员接管他人的 Gsuite 账户
  11. 手把手教你做iOS的soap应用(webservice)
  12. android 定时唤醒蓝牙,Android保活——蓝牙唤醒(主动kill掉也可唤醒)
  13. 《数学建模与数学实验》第5版 统计分析 习题9.7
  14. centos下Linux网易云音乐,CentOS7.5安装网易云音乐
  15. 计算机telnet命令大全,Telnet 命令使用方法详解
  16. pyhton爬取广州链家租房信息,并用tableau进行数据分析
  17. typecho图片插件_Typecho图片表情插件Smilies1.1.3更新
  18. Flutter之开屏广告缓存本地方案(无插件版),兼容 IOS、安卓
  19. 会议排座位系统图书馆座位预约系统哪个好?
  20. 深入JUnit源码之Runner

热门文章

  1. 计算机毕业设计JAVA前行国家公务员模拟笔试系统mybatis+源码+调试部署+系统+数据库+lw
  2. 计算机类公务员 真题解析,公务员考试C类计算机考试真题及答案2[文].pdf
  3. 涉密信息系统集成资质条件
  4. 【程序人生】拿到offer就稳了?实习期你还得“忍”一下
  5. Source Insight 4.0打开一会就闪退 解决方法
  6. 如何利用你所学的Python知识在网上接单赚钱?主业不行副业来凑,Python兼职月入过万这么做准成
  7. vertrigoserv mysql 密码_VertrigoServ-官方版-VertrigoServ(网络开发环境)2.37官方版-独木成林...
  8. 小米VR安装第三方APP的方法!
  9. 【软件测试——————入门篇1】
  10. nodejs死亡笔记之CentOS7虚拟机的安装配置及nodejs的安装(面向Windows编程)