题意:给你一个基因序列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]);
}
}

  

HDU 4899 Hero meet devil (状压DP, DP预处理)的更多相关文章

  1. BZOJ 3864 Hero meet devil (状压DP)

    最近写状压写的有点多,什么LIS,LCSLIS,LCSLIS,LCS全都用状压写了-这道题就是一道状压LCSLCSLCS 题意 给出一个长度为n(n<=15)n(n<=15)n(n< ...

  2. HDU 4899 Hero meet devil(状压DP)(2014 Multi-University Training Contest 4)

    Problem Description There is an old country and the king fell in love with a devil. The devil always ...

  3. hdu 4899 Hero meet devil

    传送阵:http://acm.hdu.edu.cn/showproblem.php?pid=4899 题目大意:给定一个DNA序列,求有多少长度为m的序列与该序列的最长公共子序列长度为0,1...|S ...

  4. DP套DP HDOJ 4899 Hero meet devil(国王的子民的DNA)

    题目链接 题意: 给n长度的S串,对于0<=i<=|S|,有多少个长度为m的T串,使得LCS(S,T) = i. 思路: 理解的不是很透彻,先占个坑. #include <bits/ ...

  5. HDU - 4804 Campus Design(状压+轮廓线dp)

    Campus Design Nanjing University of Science and Technology is celebrating its 60th anniversary. In o ...

  6. HDU 4336 Card Collector(状压 + 概率DP 期望)题解

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

  7. HDU 4336 Card Collector:状压 + 期望dp

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4336 题意: 有n种卡片(n <= 20). 对于每一包方便面,里面有卡片i的概率为p[i],可 ...

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

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

  9. 【BZOJ3864】Hero meet devil DP套DP

    [BZOJ3864]Hero meet devil Description There is an old country and the king fell in love with a devil ...

随机推荐

  1. Docker 资料

    一.Docker 入门介绍 http://dockone.io/article/111 二.ASP.NET Core + Docker http://www.cnblogs.com/keepcodin ...

  2. Java 简单图片截取

    package cn.byref.demo.image; import java.awt.Rectangle; import java.awt.image.BufferedImage; import ...

  3. GEF入门实例_总结_04_Eclipse插件启动流程分析

    一.前言 本文承接上一节:GEF入门实例_总结_03_显示菜单和工具栏 注意到app目录下的6个类文件. 这6个文件对RCP应用程序而言非常重要,可能我们现在对这几个文件的理解还是云里雾里,这一节我们 ...

  4. New Concept English three (51)

    22 76 Predicting the future is notoriously difficult. Who could have imagined, in the mid 1970s, for ...

  5. MySQL引擎各个引擎对比介绍

    1.什么是存储引擎? 存储引擎类似于录制的视频文件,可以转换成不同的格式,如MP4,avi等格式,而存储在我们的磁盘上也会存在于不同类型的文件系统中如:Windows里常见的NTFS,fat32等.存 ...

  6. mysql分表和分区实际应用简介

    一,什么是mysql分表,分区 什么是分表,从表面意思上看呢,就是把一张表分成N多个小表,具体请看mysql分表的3种方法 什么是分区,分区呢就是把一张表的数据分成N多个区块,这些区块可以在同一个磁盘 ...

  7. 机器学习(六)— logistic回归

    最近一直在看机器学习相关的算法,今天学习logistic回归,在对算法进行了简单分析编程实现之后,通过实例进行验证. 一 logistic概述 个人理解的回归就是发现变量之间的关系,也就是求回归系数, ...

  8. JavaWeb框架_Struts2_(二)----->Struts2的核心配置

    2.  Struts2的核心配置 2.1  配置Struts.xml文件 2.1.1 Struts.xml文件 Struts2框架的核心配置文件是Struts.xml,该文件主要用来配置Action和 ...

  9. PADS Layout CAM 的中高级焊盘选项

    PADS Layout CAM 的中高级焊盘选项 PADS CAM Gerber 输出非常灵活. 以至于很多人跳坑. 以这个这选项,最好的方式就是不勾.

  10. MySQL 预处理语句prepare、execute、deallocate的使用

    所以对于中文乱码,需要去check的地方有如下3个:1.mysql窗口的字符编码(xshell连接的远程工具的字符集设置):2.数据库的字符编码(show variables like '%char% ...