hdu 1560 DNA sequence(IDA*)
生活随笔
收集整理的這篇文章主要介紹了
hdu 1560 DNA sequence(IDA*)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=1560
DNA sequence
Time Limit: 15000/5000 MS (Java/Others)????Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1505????Accepted Submission(s): 730Problem 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
Author LL
Source HDU 2006-12 Programming Contest
Recommend LL???|???We have carefully selected several similar problems for you:??1667?1043?1813?1226?1401?
題目大意:給n個序列,找到一個包含所有給出序列的最短長度并輸出。 解題思路:采用gei_h()得到當前狀態下最長的未匹配的長度。在進行深度搜索。每個串的長度不超過5,最多只有8個序列,所以IDA不超過40次。
詳見代碼。 #include <iostream> #include <cstdio> #include <cstring> #include <queue>using namespace std;int n; char ch[10][10]; int len[10],want; char dir[10]= {'A','C','G','T'}; int wei[10];//記錄第i個序列正在使用第幾個位置int get_h() {int t=0;for (int i=1; i<=n; i++){t=max(t,len[i]-wei[i]);//得到當前情況下最長的未被匹配的長度}return t; }int IDA(int dep) {if(dep+get_h()>want)//當前長度+估測的長度比我想要的還大的話,就不必繼續搜索{//cout<<get_h()<<endl;return 0;}if(dep==want)return 1;int tmp[10];for (int i=0; i<4; i++){int flag=0;memcpy(tmp,wei,sizeof(wei));//先存一下for (int j=1; j<=n; j++){if (ch[j][wei[j]]==dir[i])//當前的這一位符合{flag=1;//標記當前狀態可以wei[j]++;}}if (flag){if(IDA(dep+1))//如果可以就繼續搜索return 1;memcpy(wei,tmp,sizeof(tmp));//還原回來}}return 0; }int main() {int T;scanf("%d",&T);while (T--){int Max=0;scanf("%d",&n);for (int i=1; i<=n; i++){scanf("%s",ch[i]);len[i]=strlen(ch[i]);if (len[i]>Max)Max=len[i];}memset(wei,0,sizeof(wei));want=Max;//從最長序列開始查找while (1){if (IDA(0)){break;}want++;}printf ("%d\n",want);}return 0; }
總結
以上是生活随笔為你收集整理的hdu 1560 DNA sequence(IDA*)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 进度条实现原理_java进度条
- 下一篇: vs运行c语言代码快捷键,VS2010快