题意:一段DNA序列s,只包含字符ATGC,长度不超过15,求有多少种长度为n的DNA序列与s的最长公共子序列长度为0~len。

解法:状压dp。

LSC:

if(a[i] == b[j])

dp[i][j] = dp[i - 1][j - 1] + 1;

else

dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);

dp[i][j]表示分别以第i个元素和第j个元素结尾的待求字符串和已知字符串s的最长公共子序列,dp[0 ~ j]可以表示一种待求字符串的状态,可以进一步求出再添加一个字符后的状态。

例如:s为GTC

dp数组为[0, 1, 1],说明最长公共子序列为T,加A后状态不变为011,加G后变为111,加T后不变,加C后变为012。

dp数组为非降序数列,所以可以在上升的位置置1,不变的位置置0,转化为二进制,例如状态011->010,012->011。

记录状态后,列出状态转移方程:

dp[i][j状态分别加四个字符后的状态] += dp[i - 1][j]。

i表示待求字符串长度,j表示状态,因为只与上一长度有关,所以可以用滚动数组优化。

代码:

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string>
#include<string.h>
#include<math.h>
#include<limits.h>
#include<time.h>
#include<stdlib.h>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<vector>
#define LL long long
using namespace std;
const int mod = 1e9 + 7;
char dna[5] = "ATGC";
LL dp[2][70000], prt[20];
int res[20], res1[20], ans[70000][5];
int main()
{int T;while(~scanf("%d", &T))while(T--){memset(res, 0, sizeof res);memset(ans, 0, sizeof ans);memset(dp, 0, sizeof dp);string s;cin >> s;int n;cin >> n;int len = s.size();int maxx = 1 << len;for(int i = 0; i < maxx; i++){res[0] = 0;int tmp = i;int cnt = 1;for(int j = 0; j < len; j++)//转化当前状态为正常dp{if(tmp & 1)res[cnt] = res[cnt - 1] + 1;elseres[cnt] = res[cnt - 1];cnt++;tmp >>= 1;}for(int j = 0; j < 4; j++)//计算分别加4个字符后状态变化{res1[0] = 0;for(int k = 1; k <= len; k++){if(s[k - 1] == dna[j])res1[k] = res[k - 1] + 1;elseres1[k] = max(res1[k - 1], res[k]);}for(int k = len; k > 0; k--)//记录i状态后添加字符j后的状态{ans[i][j] <<= 1;if(res1[k] > res1[k - 1])ans[i][j] += 1;}}}dp[0][0] = 1;for(int i = 0; i < n; i++){memset(dp[(i + 1) & 1], 0, sizeof dp[(i + 1) & 1]);for(int j = 0; j < maxx; j++){for(int k = 0; k < 4; k++){dp[(i + 1) & 1][ans[j][k]] += dp[i & 1][j];if(dp[(i + 1) & 1][ans[j][k]] > mod)dp[(i + 1) & 1][ans[j][k]] %= mod;}}}memset(prt, 0, sizeof prt);for(int i = 0; i < maxx; i++){int cnt = 0;int tmp = i;while(tmp){if(tmp & 1)cnt++;tmp >>= 1;}prt[cnt] += dp[n & 1][i];if(prt[cnt] > mod)prt[cnt] %= mod;}for(int i = 0; i <= len; i++)printf("%lld\n", prt[i]);}return 0;
}

运行了6s···

可以进行去掉无法达到的状态的优化···

不过写不动了···

HDU 4899 Hero meet devil相关推荐

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

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

  2. [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 ...

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

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

  4. 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∣ 发现这个状态 ...

  5. BZOJ3864 hero meet devil

    题目链接:https://darkbzoj.cf/problem/3864 这个是DP套DP的典型例题. 常规LCS的求法: 设dp[i][j]表示到a[i],b[j]的LCS. 那么if \(a[i ...

  6. bzoj千题计划241:bzoj3864: Hero meet devil

    http://www.lydsy.com/JudgeOnline/problem.php?id=3864 题意: 给你一个DNA序列,求有多少个长度为m的DNA序列和给定序列的LCS为0,1,2... ...

  7. #3864. Hero meet devil dp套dp + 状压 + 状态机

    传送门 文章目录 题意: 思路: 题意: 给你一个只包含ACGTACGTACGT的串sss,再给你一个mmm,第iii行输出有多少个长度为mmm且只包含ACGTACGTACGT的串与sss的lcslc ...

  8. 「BZOJ3864」Hero meet devil 题解

    简要题意 给你一个只由 A G C T AGCT AGCT 组成的字符串 S S S ,对于每个 0 ≤ i ≤ ∣ S ∣ 0 \leq i \leq |S| 0≤i≤∣S∣,问有多少个只由 A G ...

  9. hdu4899 Hero meet devil

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

最新文章

  1. SAP MM PO中的Delivery Date并非保存在EKPO表里
  2. 基于Socket的UDP和TCP编程介绍
  3. Canvas实用库Fabric.js使用手册
  4. geth安装失败,双击后不显示或等待很久后报错
  5. Sharepoint 2010配置form认证方式(SQL账号)
  6. SSH(Secure Shell) 介绍一
  7. 【渝粤题库】陕西师范大学202041 国际经济学 作业(专升本)
  8. Thread.join(), CountDownLatch、CyclicBarrier和 Semaphore区别,联系及应用
  9. 巧用枚举CommandBehavior关闭SqlDataReader联接数据库时的conn.open状态
  10. python莫比乌斯内接矩形_莫比乌斯反演例题集 ^_^(示例代码)
  11. java实现支付宝第三方登录_Java 实现QQ第三方登录(附赠:完整代码)
  12. ANSYS or Abaqus? 一个过来人的工作感悟
  13. 数据集Freebase-FB15k-237
  14. 电厂GPS北斗时钟同步(卫星时间同步系统)组成及配置
  15. java中成员变量的加载时机_工作奇谈——JAVA高级特性之反射
  16. 求问,如何计算距离一个经纬度坐标点500㎞范围内的半圆面积平均?
  17. 为葡萄酒数据集构造SVM分类器和使用随机森林回归模型预测葡萄酒质量
  18. swin transformer 转 onnx
  19. Css实现手机端页面强制横屏
  20. Selenium系列教程 - 文件上传

热门文章

  1. 使用IDEA 的DBMS 链接达梦数据库
  2. A1111. 填数字(dfs遍历模板)【1】
  3. 数据治理建设管理方案(参考)(一)
  4. 小米R3G路由器Breed控制台刷OpenWrt固件
  5. 求助,如何理解单相逆变器中的电压电流双闭环PI控制
  6. 又一款开源客服系统开放了
  7. android代码流分析工具,视频码流分析工具(Elecard StreamAnalyzer)下载 v4.0.171116 官方版 - 比克尔下载...
  8. 地图数据快速渲染------基于分布式系统的准实时渲染技术(前段+后端)
  9. win2000 Ntldr 丢失
  10. 华为鸿蒙系统的推出,我们开发者应该做什么?