开一个数组来记录当前枚举出的字符串已经包含了每个所给的字符串多少个字符了
然后h函数为 每个所给字符串未包含的字符数的 最大值
AC代码如下:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
#define MAX 0x3f3f3f3f
char s[10][10];
int N;
int length[10], record[10];
int maxdeep;
char addchar[4] = { 'A', 'T', 'C', 'G' };
bool check(){
for( int i = 0; i < N; i++ ){
if( record[i] != length[i] ){
return false;
}
}
return true;
}
int h(){
int ans = 0;
for( int i = 0; i < N; i++ ){
ans = max( ans, length[i] - record[i] );
}
return ans;
}
bool DFS( int deep ){
if( deep == maxdeep ){
return check();
}
if( deep + h() > maxdeep ){
return false;
}
for( int i = 0; i < 4; i++ ){
int temp[10];
for( int j = 0; j < N; j++ ){
if( s[j][record[j]] == addchar[i] ){
temp[j] = 1;
}else{
temp[j] = 0;
}
}
for( int j = 0; j < N; j++ ){
record[j] += temp[j];
}
if( DFS( deep + 1 ) ){
return true;
}
for( int j = 0; j < N; j++ ){
record[j] -= temp[j];
}
}
return false;
}
int main(){
int T;
scanf( "%d", &T );
while( T-- ){
cin >> N;
for( int i = 0; i < N; i++ ){
scanf( "%s", s[i] );
}
memset( record, 0, sizeof( record ) );
for( int i = 0; i < N; i++ ){
length[i] = strlen( s[i] );
}
maxdeep = 0;
while( 1 ){
memset( record, 0, sizeof( record ) );
if( DFS( 0 ) ){
break;
}
maxdeep++;
}
cout << maxdeep << endl;
}
return 0;
}