[kuangbin带你飞]专题二 搜索进阶 E
2017-08-01 19:10
246 查看
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
这道题是对退出DFS的判断问题,首先要判断一下最长的有多长,然后当
这个节点对所有的DNA都没有贡献时就退出,这里用到了迭代加深搜索,就是我每一次搜索都指定一个最大搜索长度,如果大于这个搜索长度就退出,然后再深入一层,防止无限次的加深搜索
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
这道题是对退出DFS的判断问题,首先要判断一下最长的有多长,然后当
这个节点对所有的DNA都没有贡献时就退出,这里用到了迭代加深搜索,就是我每一次搜索都指定一个最大搜索长度,如果大于这个搜索长度就退出,然后再深入一层,防止无限次的加深搜索
#include<bits/stdc++.h> using namespace std; #define bug cout<<"This is a BUG!"<<endl; using LL=int64_t; const int INF=0x3f3f3f3f; int n,deep,ans=-1; char s[10][10]; int size[10]; char cnt[5]={'A','T','C','G'}; void dfs(int num,int len[]) { int sum=0; if(ans!=-1||num>deep) return; for(int i=0;i<n;i++) sum=max(sum,size[i]-len[i]); if(num+sum>deep) return ; if(sum==0) {ans=num;return ;} for(int i=0;i<4;i++) { int flag=0; int tlen[10]={0}; for(int j=0;j<n;j++) { if(s[j][len[j]]==cnt[i]) { tlen[j]=len[j]+1; flag++; } else tlen[j]=len[j]; } if(flag>0) dfs(num+1,tlen); } return ; } int main() { ios::sync_with_stdio(0); cin.tie(0); int T; cin>>T; for(int k=0;k<T;k++) { ans=-1,deep=0; cin>>n; memset(s,0,sizeof(s)); for(int i=0;i<n;i++) { cin>>s[i]; size[i]=strlen(s[i]); deep=max(deep,size[i]); } int len[10]={0}; while(1) { dfs(0,len); if(ans!=-1) break; deep++; } cout<<ans<<endl; } return 0; }
相关文章推荐
- 【算法系列学习】[kuangbin带你飞]专题二 搜索进阶 D - Escape (BFS)
- [kuangbin带你飞]专题二 搜索进阶 I - A计划
- [kuangbin带你飞]专题二 搜索进阶 C - 哈密顿绕行世界问题(HDU 2181)
- [kuangbin带你飞]专题二 搜索进阶 D
- [kuangbin带你飞]专题二-搜索进阶-A-Eight
- [kuangbin带你飞]专题二 搜索进阶 题解(康托展开、映射、迭代加深)
- [kuangbin带你飞]专题二 搜索进阶 G
- [kuangbin带你飞]专题二 搜索进阶 I - A计划(HDU 2102)
- 【算法系列学习三】[kuangbin带你飞]专题二 搜索进阶 之 A-Eight 反向bfs打表和康拓展开
- [kuangbin带你飞]专题二-搜索进阶-B-Eight II
- [kuangbin带你飞]专题二-搜索进阶-D-Escape
- [kuangbin带你飞]专题二 搜索进阶 C
- [kuangbin带你飞]专题二 搜索进阶 A(康拓展开+bfs)
- [kuangbin带你飞]专题二 搜索进阶 A - Eight
- [kuangbin带你飞]专题二 搜索进阶 I
- [kuangbin带你飞]专题二-搜索进阶-C-哈密顿绕行世界问题
- [kuangbin带你飞]专题二 搜索进阶
- [kuangbin带你飞]专题一 简单搜索 刷题总结
- [kuangbin带你飞]专题一 简单搜索 J UVA 11624
- [kuangbin带你飞]专题一 简单搜索 - E - Find The Multiple