# 描述

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.

# 输入

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.

# 输出

For each test case, print a line containing the length of the shortest sequence that can be made from these sequences.

• Input
1
4
ACGT
ATGC
CGTT
CAGT

• Output
8

# 题解

• 题意：给出几个DNA序列，求一个最短的字符串，使得这些DNA序列都是它的子序列
• 此题用裸dfs的话不知道结束条件容易超时，用裸bfs很容易超内存，所以我们采用迭代深搜的方法。所谓迭代深搜就是限制dfs的深度，逐渐将深度加深，起到模拟bfs的作用，又不需要bfs那么多内存，但是肯定是比bfs耗时要长
• 在迭代深搜时，用deep表示限制深度，用tot表示当前串长度，用pos[i]表示i串目前已被匹配的字符个数，如果(tot+(len[i]-pos[i])>deep)的话，说明当前限制下的深度肯定不够，这样起到剪枝的效果，也就成了所谓的IDA*搜索

# Code

Donate comment here