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\) ...
随机推荐
- python 多环境安装
1.pyenv 安装 curl -L https://raw.githubusercontent.com/yyuu/pyenv-installer/master/bin/pyenv-installer ...
- gitlab基本维护和使用
基本介绍 GitLab是一个自托管的Git项目仓库,可以自己搭建个人代码管理的仓库,功能与github类似. 安装 下载 gitlab下载地址: https://about.gitlab.com/do ...
- IOS中div contenteditable=true无法输入
在IOS中<div contenteditable="true"></div>中点击时可以弹出键盘但是无法输入.加一个样式-webkit-user-sele ...
- C++ 与OpenCV 学习笔记
联合体:当多个数据需要共享内存或者多个数据每次只取其一时,可以利用联合体(union) 1. 联合体是一种结构: 2. 他的所有成员相对于基地址的偏移量均为0: 3. 此结构空间要大到足够容纳最&qu ...
- Json.net日期格式化
1. 全局设置,可以在App_Global中配置 JsonSerializerSettings setting = new JsonSerializerSettings(); JsonConvert. ...
- bzoj3481题解
答案等于$\sum_{d|(P,Q)} d\times \varphi (P/d)$设$P=\prod_{i=1}^t p_i^{m_i}$,$P=\prod_{i=1}^t p_i^{k_i}$答案 ...
- PYTHON 写函数,检查传入字典的每一个value的长度,如果大于2,那么仅保留前两个长度的内容,并将新内容返回给调用者
def a4(arg): ret = {} for key,value in arg.items(): if len(value) > 2: ret[key] = value[0:2] else ...
- 微信小程序开发工具的数据,配置,日志等目录在哪儿? 怎么找?
原文地址:http://www.wxapp-union.com/portal.php?mod=view&aid=359 本文由本站halfyawn原创:感谢原创者:如有疑问,请在评论内回复 ...
- matlab -xlsread 打开xls文件出错:服务器出现意外情况
错误:xlsread:服务器出现意外情况 原因:非matlab问题,Excel的com加载项启用 解决方法:office - Excel选项-加载项:管理-com加载项-转到-取消可用加载项的勾选.
- enum 与 enum class
c++11中引入了新的枚举类型---->强制枚举类型 // unscoped enum: enum [identifier] [: type] {enum-list}; // scoped e ...