直接中文了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