zoukankan      html  css  js  c++  java
  • 【HDU

    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;
    }
  • 相关阅读:
    C# 关于类的事件和委托
    C# 多态
    C# 声明方法的语法
    C# 面向对象基础
    近期发现的一些.net资源
    asp.net 2.0学习资源
    设置VSS使支持通过Internet访问
    大型社区设计:提高用户体验的10个细节
    委托的用法
    有滚动条、固定Header的ASP.Net DataGrid实现
  • 原文地址:https://www.cnblogs.com/sky-stars/p/11219615.html
Copyright © 2011-2022 走看看