zoukankan      html  css  js  c++  java
  • HDU1560(迭代加深搜索)

    DNA sequence

    Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 1914    Accepted Submission(s): 946


    Problem Description
    The twenty-first century is a biology-technology developing century. We know that a gene is made of DNA. The nucleotide bases from which DNA is built are A(adenine), C(cytosine), G(guanine), and T(thymine). Finding the longest common subsequence between DNA/Protein sequences is one of the basic problems in modern computational molecular biology. But this problem is a little different. Given several DNA sequences, you are asked to make a shortest sequence from them so that each of the given sequence is the subsequence of it.

    For example, given "ACGT","ATGC","CGTT" and "CAGT", you can make a sequence in the following way. It is the shortest but may be not the only one.

     
    Input
    The first line is the test case number t. Then t test cases follow. In each case, the first line is an integer n ( 1<=n<=8 ) represents number of the DNA sequences. The following k lines contain the k sequences, one per line. Assuming that the length of any sequence is between 1 and 5.
     
    Output
    For each test case, print a line containing the length of the shortest sequence that can be made from these sequences.
     
    Sample Input
    1
    4
    ACGT
    ATGC
    CGTT
    CAGT
     
    Sample Output
    8
    思路:迭代加深搜索。含义:在不知道迭代深度的前提下,依次探索每次的搜索深度。
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    const int MAXN=15;
    struct Node{
        char s[MAXN];
        int len,top;
    }DNA[MAXN];
    int n;
    char buf[4]={'A','C','G','T'};
    bool dfs(int l,int limit)
    {
        int remain=0;
        for(int i=0;i<n;i++)
        {
            if(DNA[i].len-DNA[i].top>remain)
            {
                remain=DNA[i].len-DNA[i].top;
            }
        }
        if(remain==0)    return true;
        if(remain+l>limit)    return false; //重要剪枝一 
        
        for(int i=0;i<4;i++)
        {
            bool tag=false;
            int vis[MAXN]={0};
            for(int j=0;j<n;j++)    
            {
                if(buf[i]==DNA[j].s[DNA[j].top])
                {
                    vis[j]=1;
                    DNA[j].top++;
                    tag=true;
                }
            }
            if(!tag)    continue;//重要剪枝二 
            if(dfs(l+1,limit))
            {
                return true;
            }
            for(int j=0;j<n;j++)
            {
                if(vis[j])
                {
                    DNA[j].top--;
                }
            }
        }
        return false;
    }
    
    int main()
    {
        int T;
        scanf("%d",&T);
        while(T--)
        {
            scanf("%d",&n);
            int limit=0;
            for(int i=0;i<n;i++)
            {
                scanf("%s",DNA[i].s);
                DNA[i].len=strlen(DNA[i].s);        
                DNA[i].top=0;
                limit=max(limit,DNA[i].len);
            }
            while(!dfs(0,limit))
            {
                for(int i=0;i<n;i++)
                {
                    DNA[i].top=0;
                }
                limit++;
            }
            printf("%d
    ",limit);
        }
        return 0;
    }
  • 相关阅读:
    Vue-cli
    vue—cli脚手架
    车联网——安全
    技术游玩
    高效寻找GitHub开源项目
    【孤*执】#2019SX# 最后der省选模板总结 ——BY.hss
    【浮*光】#状态压缩# 状压DPの相关练习题
    【浮*光】#字符串# 字符串の相关练习题
    【暖*墟】#数据结构# 可持久化Trie 与 XOR问题
    【浮*光】#数据结构# 数据结构の相关练习题
  • 原文地址:https://www.cnblogs.com/program-ccc/p/5684888.html
Copyright © 2011-2022 走看看