【HDU - 1560】DNA sequence (dfs+回溯)
DNA sequence
直接中文了
题目描述
21世纪是生物科技飞速发展的时代。我们都知道基因是由DNA组成的,而DNA的基本组成单位是A,C,G,T。在现代生物分子计算中,如何找到DNA之间的最长公共子序列是一个基础性问题。 但是我们的问题不是那么简单:现在我们给定了数个DNA序列,请你构造出一个最短的DNA序列,使得所有我们给定的DNA序列都是它的子序列。 例如,给定"ACGT","ATGC","CGTT","CAGT",你可以构造的一个最短序列为"ACAGTGCT",但是需要注意的是,这并不是此问题的唯一解。
输入
第一行含有一个数t,代表数据组数。 每组数据的第一行是一个数n,代表给定的DNA序列数量;接下来的n行每行一个字符串s,代表给定的n个DNA序列。 1<=n<=8,1<=|s|<=5
输出
对于每一组数据,输出一行中含有一个数,代表满足条件的最短序列的长度。
样例输入
1
4
ACGT
ATGC
CGTT
CAGT
样例输出
8
题目链接
https://vjudge.net/problem/HDU-1560
给出N个DNA序列,要求出一个包含这n个序列的最短序列是多长,直接dfs吧
AC代码
#include <iostream>
#include <cstdio>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <deque>
#include <vector>
#include <queue>
#include <string>
#include <cstring>
#include <map>
#include <stack>
#include <set>
#include <sstream>
#define IOS ios_base::sync_with_stdio(0); cin.tie(0);
#define Mod 1000000007
#define eps 1e-6
#define ll long long
#define INF 0x3f3f3f3f
#define MEM(x,y) memset(x,y,sizeof(x))
#define Maxn 10
using namespace std;
int pos[Maxn];//pos[i] 第i个序列正在使用第几个位置
int T,n;
int deep;//自己构造的DNA序列最小长度
char c[] = "ACGT";
struct node
{
char ch[Maxn]; //DNA的组成
int len; //DNA长度
};
node a[Maxn];//a[i] 第i个DNA序列
int init()//预估长度
{
int ans=;
for(int i=;i<n;i++)//总长度-正在使用的位置=剩下还没用的位置 即预计长度
ans=max(ans,a[i].len-pos[i]);
return ans;
}
int dfs(int step)
{
if(step+init()>deep)//预计长度+当前长度>构造DNA序列的最小长度
return ;
if(init()==)//预计长度为0,即已完成
return ;
int pre[Maxn];//先将pos保存起来,一会回溯要用
for(int i=;i<;i++)
{
int f=;
for(int j=;j<n;j++)//保存pos
pre[j]=pos[j];
for(int j=;j<n;j++)//当前这位符合,则该串的位置往后移一位
{
if(a[j].ch[pos[j]]==c[i])
{
f=;
pos[j]++;
}
}
if(f)
{
if(dfs(step+))//有符合的,则往下搜索
return ;
for(int j=;j<n;j++)//回溯
pos[j]=pre[j];
}
}
return ;
}
int main()
{
cin>>T;
while(T--)
{
deep=;//自己构造的DNA序列最小长度
cin>>n;
for(int i=;i<n;i++)//存值
{
cin>>a[i].ch;
a[i].len=strlen(a[i].ch);
deep=max(deep,a[i].len);
pos[i]=;
}
while()
{
if(dfs())
break;
deep++;
}
cout<<deep<<endl;
}
return ;
}
【HDU - 1560】DNA sequence (dfs+回溯)的更多相关文章
- HDU 1560 DNA sequence DFS
题意:找到一个最短的串,使得所有给出的串是它的子序列,输出最短的串的长度,然后发现这个串最长是40 分析:从所给串的最长长度开始枚举,然后对于每个长度,暴力深搜,枚举当前位是哪一个字母,注意剪枝 注: ...
- HDU 1560 DNA sequence(DNA序列)
HDU 1560 DNA sequence(DNA序列) Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K ...
- hdu 1560 DNA sequence(搜索)
http://acm.hdu.edu.cn/showproblem.php?pid=1560 DNA sequence Time Limit: 15000/5000 MS (Java/Others) ...
- hdu 1560 DNA sequence(迭代加深搜索)
DNA sequence Time Limit : 15000/5000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total ...
- HDU 1560 DNA sequence (IDA* 迭代加深 搜索)
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1560 BFS题解:http://www.cnblogs.com/crazyapple/p/321810 ...
- HDU 1560 DNA sequence(IDA*)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1560 题目大意:给出n个字符串,让你找一个字符串使得这n个字符串都是它的子串,求最小长度. 解题思路: ...
- HDU 1560 DNA sequence (迭代加深搜索)
The twenty-first century is a biology-technology developing century. We know that a gene is made of ...
- HDU 1560 DNA sequence A* 难度:1
http://acm.hdu.edu.cn/showproblem.php?pid=1560 仔细读题(!),则可发现这道题要求的是一个最短的字符串,该字符串的不连续子序列中包含题目所给的所有字符串 ...
- HDU - 1560 DNA sequence
给你最多8个长度不超过5的DNA系列,求一个包含所有系列的最短系列. 迭代加深的经典题.(虽然自己第一次写) 定一个长度搜下去,搜不出答案就加深大搜的限制,然后中间加一些玄学的减枝 //Twenty ...
- POJ1699 HDU 1560 Best Sequence(AC自动机 最短路)
曾写过迭代加深搜索的方法,现在使用在AC自动上跑最短路的方法 dp[i][j]表示状态为到节点i,模式串是否包含的状态为j的最短串的长度,则状态转移方程为: dp[nx][ny] = min(dp[x ...
随机推荐
- Android零基础入门第49节:AdapterViewFlipper图片轮播
原文:Android零基础入门第49节:AdapterViewFlipper图片轮播 上一期学习了ExpandableListView的使用,你已经掌握了吗?本期开始学习AdapterViewFilp ...
- Qt中加载Libevent静态库(通过reimp和rs两条语句将lib转为a)
文章来源:http://blog.sina.com.cn/s/blog_731bf4c90102wnpr.html 本文仅是个人经验总结,若有错误欢迎指教! 最近要做一个跨平台的项目,同时也涉及到网络 ...
- C# Task 的用法
C# Task 的用法(转自:http://www.wxzzz.com/683.html#) 其实Task跟线程池ThreadPool的功能类似,不过写起来更为简单,直观.代码更简洁了,使用Task来 ...
- Salesforce LWC学习(二) helloWorld程序在VSCode中的实现
上一篇我们简单的描述了一下Salesforce DX的配置以及CLI的简单功能使用,此篇主要简单描述一下LWC如何实现helloWorld以及LWC开发时应该注意的一些规范. 做国内项目的同学直观的感 ...
- TCP/IP 第四、五章
1, 2, 整个arp请求的过程. 3,arp -a 获取arp高速缓存.一般arp高速缓存存活时间20分钟,不完整的表项设置为3分钟.因为机器的ip地址可能发生改变. 4, 5,arp一般是操作系统 ...
- 39 | 从小作坊到工厂:什么是Selenium Grid?如何搭建Selenium Grid?
- Rstudio调用plot()函数时,出现错误的处理方法
按照书上的例子敲出代码后,发现Rstudio无法识别C盘user文件夹下的中文用户名.如下图所示: 按照网上的做法,尝试修改计算机user下的用户名,没修改成功. 另一种做法是在plot()函数前面加 ...
- 最牛MongoDB灾难恢复(WiredTiger.wt文件损坏,Mongo无法启动)
WiredTiger.wt文件是mongoDB的元数据文件,存储了其他数据库表的元数据信息.笔者最近遇到了WiredTiger.wt文件损坏的情况,MongoDB无法启动,数据库中的重要数据危在旦夕. ...
- 浅说——状压DP
第一次没认真听,没听懂.(有点难) 第二次才搞懂,主要位运算太烦了!!! 位运算基础知识: 名称 符号 规则 按位与 & 全一则一,否则为零 按位或 | 有一则一,否则为零 按位取反 ~ 是零 ...
- 查询IP地址的免费API
1.百度 1.http://sp0.baidu.com/8aQDcjqpAAV3otqbppnN2DJv/api.php?query=192.168.0.0&co=&resource_ ...