题意:给定一些DNA序列,求一个最短序列能够包含所有序列。

思路:记录第i个序列已经被匹配的长度p[i],以及第i序列的原始长度len[i]。则有两个剪枝:

剪枝1:直接取最长待匹配长度。1900ms

int h = 0;
for(int i = 0; i < n; ++i) {h = max(len[i] - p[i], h); //最大待匹配长度
}

剪枝二:统计每个序列里面四种序列值,并求得每种序列值的最长长度。将四种序列值加起来就是最长待匹配长度。180ms

int cal() { //至少还需要匹配的长度 memset(cost, 0, sizeof(cost));memset(tp, 0, sizeof(tp));for(int i = 0; i < n; ++i) {for(int j = p[i]; j < len[i]; ++j) tp[ha[str[i][j]]]++;for(int j = 0; j < 4; ++j) {cost[j] = max(cost[j], tp[j]);tp[j] = 0;}}int h = 0;for(int i = 0; i < 4; ++i) h += cost[i];return h;
}

剪枝二优于剪枝一。

AC代码:180ms

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
using namespace std;
map<char, int>ha;
const int maxn = 10;
char str[maxn][maxn];
int len[maxn], p[maxn];
int n, maxd, pd;
int cost[4], tp[4];
char ch[] = {'A', 'G', 'C', 'T'};int cal() { //至少还需要匹配的长度 memset(cost, 0, sizeof(cost));memset(tp, 0, sizeof(tp));for(int i = 0; i < n; ++i) {for(int j = p[i]; j < len[i]; ++j) tp[ha[str[i][j]]]++;for(int j = 0; j < 4; ++j) {cost[j] = max(cost[j], tp[j]);tp[j] = 0;}}int h = 0;for(int i = 0; i < 4; ++i) h += cost[i];return h;
}int dfs(int cnt) {int h = cal();if(h == 0) {printf("%d\n", maxd);return 1;}if(h + cnt > maxd) {pd = min(h + cnt, pd);return 0;}int old[maxn];memcpy(old, p, sizeof(old));for(int i = 0; i < 4; ++i) {char c = ch[i];int flag = 0;for(int j = 0; j < n; ++j) {if(p[j] < len[j] && str[j][p[j]] == c) {flag = 1;++p[j];}}if(flag && dfs(cnt + 1)) return 1;memcpy(p, old, sizeof(old));}return 0;
}int main() {for(int i = 0; i < 4; ++i) ha[ch[i]] = i;int T;scanf("%d", &T);while(T--) {maxd = 0;memset(p, 0, sizeof(p));scanf("%d", &n);for(int i = 0; i < n; ++i) {scanf("%s", str[i]);len[i] = strlen(str[i]);maxd = max(maxd, len[i]);}while(1) {pd = 1 << 30;if(dfs(0)) break;maxd = pd;}}return 0;
}

如有不当之处欢迎指出!

转载于:https://www.cnblogs.com/flyawayl/p/8305422.html

HDU1560 DNA sequence IDA* + 强力剪枝 [kuangbin带你飞]专题二相关推荐

  1. [kuangbin带你飞]专题二十一 概率期望 部分题解

    2018-03-08  18:02:20 A - A Dangerous Maze LightOJ - 1027 题意: 小花的迷宫入口有n个门  走每个门的概率都是相同的  每个门有一个值x  x可 ...

  2. kuangbin带你飞专题合集

    题目列表 [kuangbin带你飞]专题一 简单搜索 [kuangbin带你飞]专题二 搜索进阶 [kuangbin带你飞]专题三 Dancing Links [kuangbin带你飞]专题四 最短路 ...

  3. “kuangbin带你飞”专题计划——专题十四:数论基础

    写在前面 1.目前还没啥写的.开始时间:2021-05-13(其实博客上看得到该博客创建时间的) 2.上一个专题刷的是网络流(博客总结),属于第一次接触.本来想的是一周特别高效,然后一周略划水,结果是 ...

  4. (2021-07-14~)“kuangbin带你飞”专题计划——专题十三:基础计算几何

    目录 前言 参考博客 自己总结的东西: 难度判断? 题目 1.[TOYS POJ - 2318 ](解决) 2.[Toy Storage POJ - 2398 ](解决) 3.[Segments PO ...

  5. kuangbin带你飞 专题1-23 题单

    kuangbin大神,对于打过ACM比赛的ACMer,无人不知无人不晓. 在此,附上vjudge平台上一位大神整理的[kuangbin带你飞]专题目录链接. [kuangbin带你飞专题目录1-23] ...

  6. [kuangbin带你飞]专题十二 基础DP1 题解+总结

    kuangbin带你飞:点击进入新世界 总结: 简单dp,最近在做,持续更新. 文章目录 总结: 1.Max Sum Plus Plus 2.Ignatius and the Princess IV ...

  7. [kuangbin带你飞]专题五 并查集 题解+总结

    kuangbin带你飞:点击进入新世界 总结: 本人算是初学者中的初学者,欢迎交流~ 并查集的接触过的不多,大概只有普通并查集,带权并查集,种族并查集,传说中的可持续化并查集只是听说过还没有接触,不过 ...

  8. [kuangbin带你飞]专题五查并集

    写了几个查并集得题,成功把自己写晕了 之后写下面得题(写不下去了) **poj-2912 poj 文章目录 1.POJ - 1611(模板题) 2.HDU - 1213(模板题) 3.poj2236( ...

  9. [kuangbin带你飞]专题七线段树 更新ing

    这,先写应该再两个月之前就已经写好了,只是没有发出来,还有些题没有做,慢慢更新,一下线段树吧.其实每个专题都觉得恶心 淦 建议写的时候每个题都要自己去敲,不要直接把模板拿过来改一改 之前写的一个无任何 ...

最新文章

  1. MySQL数据库中的MyISAM和InnoDB存储引擎对比
  2. R语言ggplot2进行特定国家或者地区的地图可视化、在地图上标出所有首府城市所在地(plot the locations of the capital cities)
  3. c++ 打开添加删除程序_Docker 添加容器到一个网络
  4. 别让用户发呆——设计中的防呆策略
  5. 银行不能成为外国资本的“***”
  6. 【建议收藏】这个工具专门用于寻找路由器中的安全漏洞
  7. Android应用开发基础篇(1)-----Button
  8. mfc 弹簧_弹簧和线程:异步
  9. java面试题35 给定以下JAVA代码,这段代码运行后输出的结果是()
  10. python求奇数的乘积_Python中的推导式使用详解
  11. [LeetCode]题解(python):068-Text Justification
  12. 计算机科技兴趣小组活动总结,信息技术兴趣小组活动总结
  13. BZOJ 3384: [Usaco2004 Nov]Apple Catching 接苹果( dp )
  14. NLP ---文本情感分析
  15. DSP SRIO接口认识
  16. 不用安装界面器实现系统支持xvid编码器
  17. 用pdftocairo将PDF图片转成svg矢量图
  18. Redis 6 入门到入坟 详细教程 @学习笔记
  19. linux cp omitting 复制,linux 系统 cp: omitting directory 问题解决
  20. 域名被hold了怎么办?

热门文章

  1. vector中针对自定义类型的排序
  2. java虚拟机手机系统,微软java虚拟机
  3. java 反转二叉树 非递归_【刷算法】翻转二叉树的递归和非递归解法
  4. 液晶显示屏怎么显示泰文_什么是LCD液晶显示屏
  5. java不带括号_java – 打印数组,不带括号和逗号
  6. Keras深度学习实战(1)——神经网络基础与模型训练过程详解
  7. wordpress创建_如何创建WordPress儿童主题
  8. jquery中each_如何在jQuery中使用each()
  9. 在Windows Server 2008 R2上安装Ftp服务
  10. ssh相互访问不用密码