【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[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;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM