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\) ...
随机推荐
- Codility NumberSolitaire Solution
1.题目: A game for one player is played on a board consisting of N consecutive squares, numbered from ...
- epoll & socket 连接数突破
http://shenfeng.me/how-far-epoll-can-push-concurrent-socket-connection.html
- erlang 虚机性能调优
erlang 默认启动参数更多的是针对电信平台实时特性,简单调整参数能很大程度降低CPU消耗,提高处理能力. 1. 关闭spin_wait 设置参数:+sbwt none 我上一篇文章提到:erlan ...
- git服务器搭建总结
1.软件选择 服务端软件:由于我对linux还不熟悉,而且公司用的都是windows,于是找到了bonobo,这是一个基于.net framework 4.5和.net mvc4的开源软件,iis7. ...
- cf591d
题意:给出船的最大速度v,起点,终点.风在前t秒是一个方向,t秒后就一直是第二个方向.两个方向已知. 船速永远大于风速.问船在自由掌握速度和行驶方向的情况下,最快多久到终点. 分析:首先排除一种方法, ...
- ACM/ICPC 之 DP解有规律的最短路问题(POJ3377)
//POJ3377 //DP解法-解有规律的最短路问题 //Time:1157Ms Memory:12440K #include<iostream> #include<cstring ...
- Markdown基本语法
Markdown 基本语法记录 # 欢迎使用 Cmd Markdown 编辑阅读器 ------ 我们理解您需要更便捷更高效的工具记录思想,整理笔记.知识,并将其中承载的价值传播给他人,**Cmd M ...
- 如何在Linux中搭建禅道8.4.1(httpd+php+mysql)
1.安装httpd 命令:yum install httpd 然后一路y即可 2.安装php 命令:yum install php 3.安装php-mysql 命令:yum install php ...
- Qt在ui中使用代码添加新的控件
QLabel* label = new QLabel(ui->centralWidget);
- js获取文档高度
网页可见区域宽: document.body.clientWidth网页可见区域高: document.body.clientHeight网页可见区域宽: document.body.offsetWi ...