题意:给你一个基因序列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. Java源码阅读的真实体会(一种学习思路)【转】

    Java源码阅读的真实体会(一种学习思路)   刚才在论坛不经意间,看到有关源码阅读的帖子.回想自己前几年,阅读源码那种兴奋和成就感(1),不禁又有一种激动. 源码阅读,我觉得最核心有三点:技术基础+ ...

  2. Apache CommonLogging + Log4J

    package cn.byref.demo.logging; import org.apache.commons.logging.Log; import org.apache.commons.logg ...

  3. @angular/cli项目构建--httpClient

    app.module.ts update imports: [ HttpClientModule] product.component.ts import {Component, OnInit} fr ...

  4. Uncaught TypeError: this.canvas.getContext is not a function

    /**************************************************************************** * Uncaught TypeError: ...

  5. Phone numbers

    Phone number in Berland is a sequence of n digits. Often, to make it easier to memorize the number, ...

  6. C# Message 消息处理

    一.消息概述 Windows下应用程序的执行是通过消息驱动的.消息是整个应用程序的工作引擎,我们需要理解掌握我们使用的编程语言是如何封装消息的原理.C#自定义消息通信往往采用事件驱动的方式实现,但有时 ...

  7. Http之ContentType

    引言: 在Http请求中,我们每天都在使用Content-type来指定不同格式的请求信息,但是却很少有人去全面了解content-type中允许的值有多少,这里将讲解Content-Type的可用值 ...

  8. redis之 centos 6.7 下安装 redis-3.2.5

    前期准备:1. 操作系统需要安装 gcc 包 与  TCL 库, 通过配置本地 yum 源 ,yum -y install gcc . yum -y install tcl安装2. 下载 redis ...

  9. bootstrap排版实战

    bootstrap+angular实战 CASE-01:页面总体排版 说明:页面排版整体分为三个部分(见产品图):上导航条(红色区域).左导航条(紫色区域).内容区域(蓝色区域).左导航条的区域是由整 ...

  10. git revert reset

    git revert是用一次新的commit来回滚之前的commit,git reset是直接删除指定的commit. git reset 是把HEAD向后移动了一下,而git revert是HEAD ...