http://acm.hdu.edu.cn/showproblem.php?pid=1560
分析:这已经是神一般的剪枝了,膜拜……
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int NM=10;
char str[NM][NM],cs[4]={'A','C','T','G'};
int v[NM],len[NM],sta[NM],dep,n;
bool flag;
int compare() //A*的估价函数
{
int i,t,mmax;
mmax=0;
for(i=0;i<n;i++){
t=len[i]-v[i];
if(t>mmax) mmax=t;
}
return mmax;
}
bool DFS(int t)
{
int i,j,leave;
int sta[NM]; //
leave=compare();
if(leave==0) return true;
if(t+leave>dep) return false; //剩下需要匹配的单词个数+当前已匹配的单词个数
for(i=0;i<n;i++) sta[i]=v[i];
for(j=0;j<4;j++){
flag=false;
for(i=0;i<n;i++){
if(str[i][v[i]]==cs[j]) //匹配一个字符串的第v[i]个字符
{
flag=true;
v[i]++;
}
}
if(!flag) continue; //没有一个匹配成功,说明该字符无效
if(DFS(t+1)) return true;
for(i=0;i<n;i++) v[i]=sta[i]; //
}
return false;
}
int main()
{
int T,i;
scanf("%d",&T);
while(T--){
scanf("%d",&n);
dep=0;
for(i=0;i<n;i++){
scanf("%s",str[i]);
len[i]=strlen(str[i]);
if(dep<len[i]) dep=len[i];
}
memset(v,0,sizeof(v));
while(!DFS(0)) //为了找出最少的所需添加的字母数
dep++;
printf("%d\n",dep);
}
return 0;
}