DP套DP HDOJ 4899 Hero meet devil(国王的子民的DNA)
题目链接
题意:
给n长度的S串,对于0<=i<=|S|,有多少个长度为m的T串,使得LCS(S,T) = i。
思路:
理解的不是很透彻,先占个坑。



#include <bits/stdc++.h> const int S = (1 << 15) + 5;
const int MOD = 1e9 + 7; char color[] = "ATGC";
char s[20];
int pre[20], lcs[20];
int dp[2][S], add[S][4];
int ans[20];
int n, m; void add_mod(int &a, int b) {
a += b;
if (a >= MOD) {
a -= MOD;
}
} int bit_count(int x) {
return x ? bit_count (x >> 1) + (x & 1) : x;
} void init() {
n = strlen (s + 1);
for (int state=0; state<(1<<n); ++state) { //状压枚举S与T公共点的组合
pre[0] = 0;
for (int i=1; i<=n; ++i) {
pre[i] = pre[i-1] + ((state>>(i-1)) & 1); //S匹配到前i个时LCS的长度
}
for (int k=0; k<4; ++k) { //T的某一个位置是color[k],新的LCS的长度和公共点位置
for (int i=1; i<=n; ++i) {
if (s[i] == color[k]) {
lcs[i] = pre[i-1] + 1;
} else {
lcs[i] = std::max (lcs[i-1], pre[i]);
}
} int &tmp = add[state][k] = 0; //对于state状态,加一个颜色k后新的state
for (int i=1; i<=n; ++i) {
tmp |= ((lcs[i]!=lcs[i-1]) << (i-1));
}
}
}
} void solve() {
int now = 0;
memset (dp[now], 0, sizeof (dp[now]));
dp[now][0] = 1;
for (int i=1; i<=m; ++i) {
now ^= 1;
memset (dp[now], 0, sizeof (dp[now]));
for (int state=0; state<(1<<n); ++state) {
for (int k=0; k<4; ++k) {
add_mod (dp[now][add[state][k]], dp[now^1][state]);
}
}
}
memset (ans, 0, sizeof (ans));
for (int state=0; state<(1<<n); ++state) {
add_mod (ans[bit_count (state)], dp[now][state]);
}
for (int i=0; i<=n; ++i) {
printf ("%d\n", ans[i]);
}
} int main() {
int T;
scanf ("%d", &T);
while (T--) {
scanf ("%s", s + 1);
scanf ("%d", &m);
init (); solve ();
}
return 0;
}
DP套DP HDOJ 4899 Hero meet devil(国王的子民的DNA)的更多相关文章
- 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 ...
- hdu 4899 Hero meet devil
传送阵:http://acm.hdu.edu.cn/showproblem.php?pid=4899 题目大意:给定一个DNA序列,求有多少长度为m的序列与该序列的最长公共子序列长度为0,1...|S ...
- HDU 4899 Hero meet devil (状压DP, DP预处理)
题意:给你一个基因序列s(只有A,T,C,G四个字符,假设长度为n),问长度为m的基因序列s1中与给定的基因序列LCS是0,1......n的有多少个? 思路:最直接的方法是暴力枚举长度为m的串,然后 ...
- DP套DP
DP套DP,就是将内层DP的结果作为外层DP的状态进行DP的方法. [BZOJ3864]Hero meet devil 对做LCS的DP数组差分后状压,预处理出转移数组,然后直接转移即可. tr[S] ...
- bzoj 3864: Hero meet devil [dp套dp]
3864: Hero meet devil 题意: 给你一个只由AGCT组成的字符串S (|S| ≤ 15),对于每个0 ≤ .. ≤ |S|,问 有多少个只由AGCT组成的长度为m(1 ≤ m ≤ ...
- 【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 ...
- [模板] dp套dp && bzoj5336: [TJOI2018]party
Description Problem 5336. -- [TJOI2018]party Solution 神奇的dp套dp... 考虑lcs的转移方程: \[ lcs[i][j]=\begin{ca ...
- hdu4899 Hero meet devil
题目链接 题意 给出一个长度字符串\(T\),其中只包含四种字符\((A,C,G,T)\),需要找一个字符串\(S\),使得\(S\)的长度为\(m\),问\(S\)和\(T\)的\(lcs\)为\( ...
- BZOJ 3864 Hero meet devil 超详细超好懂题解
题目链接 BZOJ 3864 题意简述 设字符集为ATCG,给出一个长为\(n(n \le 15)\)的字符串\(A\),问有多少长度为\(m(m \le 1000)\)的字符串\(B\)与\(A\) ...
随机推荐
- java解析xml的三种方法
java解析XML的三种方法 1.SAX事件解析 package com.wzh.sax; import org.xml.sax.Attributes; import org.xml.sax.SAXE ...
- STM32f10xxx 之 GPIO口配置
背景 配置stm32f103使其完成PWM输出的过程中,在配置GPIO口的时候,按照习惯配置GPIO口的speed为50MHZ,突然就意识到,为什么大部分例程习惯配置为50MHZ,而不是其它值,即有了 ...
- nmq消息队列解析
消息中间件NMQ 1.What is nmq? nmq = new message queue; 一个通用消息队列系统 为在线服务设计 什么是消息队列?问什么需要?有哪些功能? 消息队列的本质:1.多 ...
- centos7 使用updatedb和locate命令
centos7默认是没有安装mlocate的,所以无法使用这两个命令 yum install mlocate 就可以了 参考:https://fedorahosted.org/mlocate/
- ES6学习笔记二
字符串遍历 var str = 'hello'; for(let s of str){console.log(s += ' ')} //h e l l o 字符串查找:添加了include(str,i ...
- 耿丹CS16-2班第七次作业汇总
Deadline: 2016-11-27 11:59pm 作业内容 第七次作业总结 01.每次成绩发布,麻烦没交作业的同学(暂定得分为-5的),请及时补交: 02.想不出来可以,代码乱成一团不行,命名 ...
- powershell通过wps excel导出csv
powershell比较强大,比较好用,比较方便. $et=New-Object -ComObject et.application #$et.Visible=$true $et.DisplayAle ...
- curl及postman专题
一. 步骤 1: 下载cURL工具 使用您的Windows机器从cURL web站点下载最新版本的cURL: (1) 通常情况下,多数的Windows用户可以从官网下载页面http://curl.ha ...
- docker 目录迁移
(ubuntu 12.04) 默认路径 /var/lib/docker --> /data/docker root@node1:~# service docker stop root@node ...
- POJ 2823 Sliding Window 线段树区间求和问题
题目链接 线段树区间求和问题,维护一个最大值一个最小值即可,线段树要用C++交才能过. 注意这道题不是求三个数的最大值最小值,是求k个的. 本题数据量较大,不能用N建树,用n建树. 还有一种做法是单调 ...