题目链接

题意:

  给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)的更多相关文章

  1. 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 ...

  2. hdu 4899 Hero meet devil

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

  3. HDU 4899 Hero meet devil (状压DP, DP预处理)

    题意:给你一个基因序列s(只有A,T,C,G四个字符,假设长度为n),问长度为m的基因序列s1中与给定的基因序列LCS是0,1......n的有多少个? 思路:最直接的方法是暴力枚举长度为m的串,然后 ...

  4. DP套DP

    DP套DP,就是将内层DP的结果作为外层DP的状态进行DP的方法. [BZOJ3864]Hero meet devil 对做LCS的DP数组差分后状压,预处理出转移数组,然后直接转移即可. tr[S] ...

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

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

  6. 【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 ...

  7. [模板] dp套dp && bzoj5336: [TJOI2018]party

    Description Problem 5336. -- [TJOI2018]party Solution 神奇的dp套dp... 考虑lcs的转移方程: \[ lcs[i][j]=\begin{ca ...

  8. hdu4899 Hero meet devil

    题目链接 题意 给出一个长度字符串\(T\),其中只包含四种字符\((A,C,G,T)\),需要找一个字符串\(S\),使得\(S\)的长度为\(m\),问\(S\)和\(T\)的\(lcs\)为\( ...

  9. BZOJ 3864 Hero meet devil 超详细超好懂题解

    题目链接 BZOJ 3864 题意简述 设字符集为ATCG,给出一个长为\(n(n \le 15)\)的字符串\(A\),问有多少长度为\(m(m \le 1000)\)的字符串\(B\)与\(A\) ...

随机推荐

  1. KMP学习之旅

    说起kmp就要从字符串的匹配说起,下面我们谈谈字符串的匹配 给定一个原字符串:bababababababababb,再给定一个模式串:bababb,求模式串是否在源字符串中出现 最简单的方法就是遍历源 ...

  2. html5 第一天

    html4与html5的琐碎比较,不全,第一次写,望多多包涵. 一 兼容性:html5在老版本的浏览器上也可以运行 二 实用性:HYML5都是封装的简单使用功能 三非革命性的发展 Html5向前兼容, ...

  3. iOS小知识:使UIButton中的图片和文字实现左对齐

    UIButton setImage 和 setTitle之后,默认的 image和title 对齐方式是居中, 由于 title 长度不固定,所以如果要几个这样有image有title的按钮纵向排列对 ...

  4. linux几个常用的命令及获取帮助的方法

    date:时间管理,可以显示.修改系统时间.  设定时间:格式:MMDDhhmm[[cc]yy][.ss]其中MM为月分,DD为日期,hh为小时,mm为分钟,CC为年的前两位 YY为年分的后两位,.s ...

  5. Eclipse使用技巧

    1,整体缩进 右缩进:选中+Tab 左缩进:选中+ Shift+Tab 2,Ctrl+O列出当前类所有方法和属性

  6. Android 学习资源收集

    1.2015最流行的Android组件.工具.框架大全 地址  http://www.open-open.com/lib/view/open1436262653692.html

  7. 微信公众帐号开发-消息创建时间long型与标准时间的互相转换

    /**  *   */ package com.hd.admin.wxmeet.utils; /**  * @author jymcpp  *  */ import java.text.DateFor ...

  8. 【EasyUI】 日期格式化

    本文经过了测试,解决getFullyear() is not a function等问题 效果如下: 首先: Oracle中字段设置为DATE,MySQL中设置为DATETIME,MyBatis中会自 ...

  9. MyBatis的getStatement()方法解析

    执行junit测试: 解析: 抛出这个异常的原因可能是因为mapper.xml配置文件中<mapper>的namespace属性配置错误造成的,没有根据命名空间的值(全称类名)找到相应映射 ...

  10. 阿里云直播PHP SDK如何使用

    前一篇聊了聊关于阿里云直播,如何进行进行调试,ok,那这篇我们就聊一聊关于阿里云直播的SDK(当然是关于PHP的),基于下面的原因: 1.直播云没有单独的SDK,直播部分的SDK是直接封装在CDN的相 ...