[BZOJ 3864][HDU 4899]Hero meet devil(DP套DP)
题意
给你一个只由AGCT组成的字符串S(|S|≤15),对于每个1≤i≤|S|
询问有多少个只由AGCT组成的长度为m(1≤m≤1000)的字符串T,使得LCS(S,T)=i。
|S|<=15. m<= 1000$
暴力显然就是2^m枚举,然后求lcs.
假设求lcs的dp数组为g[i][j]。
那么我们就把g[i]看成一个序列g[i][0],g[i][1],g[i][2],g[i][3]….
我们可以考虑表示出这个序列的状态。f[i][S]表示T的前i位与S的lcs的状态为“序列S”的方案数。但很显然我没不能直接表示这个状态。
很容易发现他们的差值不超过1.这个也很好证明。那么我们把序列差分一下,就是这就是个01的了!我们就可以开开心心的状压了!
#include<cstdio>
#include<algorithm>
#include<cstring>
#define lowbit(x) ((x)&-(x))
const int P = 1e9 + 7;using namespace std;
int _S[1 << 15][4], f[1001][1 << 15], n, m, bitc[1 << 15], ans[1 << 15], g[1001], _g[1001];
char s[18];void up (int &A, int B) { A += B; if (A >= P) A -= P; }int idx (char t) {if (t == 'A') return 0;if (t == 'C') return 1;if (t == 'G') return 2;return 3;
}void Solve () {scanf ("%s%d", s, &m); n = strlen (s); int S = (1 << n);memset (f, 0, sizeof f);memset (ans, 0, sizeof ans);// O (4 * n * 2 ^ n)for (int j = 0; j < S; ++j) {g[0] = j & 1; for (int i = 1; i < n; ++i) g[i] = g[i - 1] + (j >> i & 1);for (int k = 0; k < 4; ++k) {_g[0] = g[0] | (idx (s[0]) == k);for (int i = 1; i < n; ++i) _g[i] = g[i];for (int i = 1; i < n; ++i) if (idx (s[i]) == k && _g[i] < g[i - 1] + 1) _g[i] = g[i - 1] + 1;for (int i = 1; i < n; ++i) if (_g[i - 1] > _g[i]) _g[i] = _g[i - 1];for (int i = n - 1; i; --i) _g[i] -= _g[i - 1];for (int i = n - 2; ~i; --i) _g[i] = _g[i + 1] << 1 | _g[i];_S[j][k] = _g[0];}}f[0][0] = 1;for (int i = 0; i < m; ++i) // O (4 * m * 2 ^ n)for (int j = 0; j < S; ++j)for (int k = 0; k < 4; ++k)up (f[i + 1][_S[j][k]], f[i][j]);ans[bitc[0] = 0] = f[m][0];for (int i = 1; i < S; ++i) up (ans[bitc[i] = bitc[i - lowbit (i)] + 1], f[m][i]);for (int i = 0; i <= n; ++i) printf ("%d\n", ans[i]);
}void IO () {freopen ("3864.in", "r", stdin);freopen ("3864.out", "w", stdout);
}int main () {
// IO ();int T;scanf ("%d", &T);while (T--) Solve ();return 0;
}
[BZOJ 3864][HDU 4899]Hero meet devil(DP套DP)相关推荐
- HDU 4899 Hero meet devil (状压DP, DP预处理)
题意:给你一个基因序列s(只有A,T,C,G四个字符,假设长度为n),问长度为m的基因序列s1中与给定的基因序列LCS是0,1......n的有多少个? 思路:最直接的方法是暴力枚举长度为m的串,然后 ...
- HDU 4899 Hero meet devil
题意:一段DNA序列s,只包含字符ATGC,长度不超过15,求有多少种长度为n的DNA序列与s的最长公共子序列长度为0~len. 解法:状压dp. LSC: if(a[i] == b[j]) dp[i ...
- bzoj 3864: Hero meet devil [dp套dp]
3864: Hero meet devil 题意: 给你一个只由AGCT组成的字符串S (|S| ≤ 15),对于每个0 ≤ .. ≤ |S|,问 有多少个只由AGCT组成的长度为m(1 ≤ m ≤ ...
- BZOJ 3864: Hero meet devil (从dp性质实现dp套dp)
题意:求长度为m的,字符集大小为4的,字符串,中,与字符串S(|S|<=15)的最长公共子序列长度=i的字符串数量.i∈0→∣S∣i \ \in 0 \to |S|i ∈0→∣S∣ 发现这个状态 ...
- BZOJ3864 hero meet devil
题目链接:https://darkbzoj.cf/problem/3864 这个是DP套DP的典型例题. 常规LCS的求法: 设dp[i][j]表示到a[i],b[j]的LCS. 那么if \(a[i ...
- hdu4899 Hero meet devil
题目链接 题意 给出一个长度字符串\(T\),其中只包含四种字符\((A,C,G,T)\),需要找一个字符串\(S\),使得\(S\)的长度为\(m\),问\(S\)和\(T\)的\(lcs\)为\( ...
- [XSY] 相似(DP套DP)
相似 在看这道题前,有必要先看一下DP套DP的入门题[uoj3864]Hero meet devil,附上两篇写得不错的题解: https://blog.csdn.net/Ike940067893/a ...
- dp套dp(动态规划)
dp套dp 这是一个对于一类动态规划的计数问题的处理方法,问题常常是如果形式确定就可以直接dp,但是现在却要求满足某个要求的所有方案数,一般的处理方法就是一维负责增量构造,其他维度用来表示内部dp状态 ...
- hdu4899 dp套dp
题意:只含字母ATGC, 给定一个S串,长度小于等于15,构造满足LCS(S,T)=X的T串,求这样的T串的个数,0<=X<=|S| 网上有一堆题解,但大多数都讲得根本让人无法理解 以下 ...
最新文章
- java easyui tree例子_EasyUI Tree的简单使用
- 理解透彻--802.1d,802.1w,802.1s与802.1q
- libevent mysql_在 libevent 中使用 MariaDB(MySQL)
- 邁向IT專家成功之路的三十則鐵律 鐵律十四:IT人言談之道-守中
- Memcached深度分析【转载】
- linux mysql 性能提高,高手心得:提高MySQL性能的方法
- spring 3.0 应用springmvc 构造RESTful URL 详细讲解
- 也谈Oracle异常: ORA-06502: PL/SQL: 数字或值错误 : 字符串缓冲区太小
- 【eclipse】启动不了报错java was started but returned exit code=13
- 漏洞C:/Windows/Fonts/csrss.exe文件找不到简单查找方法
- 液压传动与气动技术【1】
- Introduction to Wireless LAN Measurements From 802.11a to 802. 11 ac
- PostgreSQL DBA(63) - Extension(pg_stat_statements)
- 20190401每周精品之认知
- 算法(Java)——双指针
- 在ENSP中配置DHCP服务器
- linux抓包查对方的mac地址,1.根据MAC地址抓包
- Dell R720xd服务器装机暨改造过程
- 2021年我的21个感悟(1/3)
- 音视频基础:音频(PCM和AAC)
热门文章
- web前端——h标签
- 密码指纹锁静电测试案例
- HTML(十二)三种常见布局:三栏式布局 双飞翼布局 圣杯布局
- 单相PWM逆变器的建模-非常基础的建模文章 讲的也很细致
- 将cityscapes数据集转换为19类 convert cityscapes to 19 categories
- 使用opencv-python对图片进行球面投影
- 【pytorch】——torch.hub
- ajax nginx 转发 sessionid_Nginx:初识Nginx(概念、在Docker中安装Nginx、常用命令、配置文件) - 怀梦想,致远方...
- tableau 集动作_集动作
- matlab指数平滑参数,三次指数平滑——matlab实现