【HDU - 1560】DNA sequence (dfs+回溯)

DNA sequence

直接中文了html

题目描述node

21世纪是生物科技飞速发展的时代。咱们都知道基因是由DNA组成的,而DNA的基本组成单位是A,C,G,T。在现代生物分子计算中,如何找到DNA之间的最长公共子序列是一个基础性问题。 可是咱们的问题不是那么简单:如今咱们给定了数个DNA序列,请你构造出一个最短的DNA序列,使得全部咱们给定的DNA序列都是它的子序列。 例如,给定"ACGT","ATGC","CGTT","CAGT",你能够构造的一个最短序列为"ACAGTGCT",可是须要注意的是,这并非此问题的惟一解。ios

输入spa

第一行含有一个数t,表明数据组数。 每组数据的第一行是一个数n,表明给定的DNA序列数量;接下来的n行每行一个字符串s,表明给定的n个DNA序列。 1<=n<=8,1<=|s|<=5.net

输出code

对于每一组数据,输出一行中含有一个数,表明知足条件的最短序列的长度。htm

样例输入blog

1
4
ACGT
ATGC
CGTT
CAGT

样例输出ci

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[10] = "ACGT"; struct node { char ch[Maxn];      //DNA的组成
    int len;     //DNA长度
}; node a[Maxn];//a[i] 第i个DNA序列
int init()//预估长度
{ int ans=0; for(int i=0;i<n;i++)//总长度-正在使用的位置=剩下还没用的位置 即预计长度
        ans=max(ans,a[i].len-pos[i]); return ans; } int dfs(int step) { if(step+init()>deep)//预计长度+当前长度>构造DNA序列的最小长度
        return 0; if(init()==0)//预计长度为0,即已完成
        return 1; int pre[Maxn];//先将pos保存起来,一会回溯要用
    for(int i=0;i<4;i++) { int f=0; for(int j=0;j<n;j++)//保存pos
            pre[j]=pos[j]; for(int j=0;j<n;j++)//当前这位符合,则该串的位置日后移一位
 { if(a[j].ch[pos[j]]==c[i]) { f=1; pos[j]++; } } if(f) { if(dfs(step+1))//有符合的,则往下搜索
                return 1; for(int j=0;j<n;j++)//回溯
                pos[j]=pre[j]; } } return 0; } int main() { cin>>T; while(T--) { deep=0;//本身构造的DNA序列最小长度
        cin>>n; for(int i=0;i<n;i++)//存值
 { cin>>a[i].ch; a[i].len=strlen(a[i].ch); deep=max(deep,a[i].len); pos[i]=0; } while(1) { if(dfs(0)) break; deep++; } cout<<deep<<endl; } return 0; }

 

原文出处:https://www.cnblogs.com/sky-stars/p/11219615.html

相关文章
相关标签/搜索