hdu 1560 IDA*

来源:互联网 发布:社交网络的影响 编辑:程序博客网 时间:2024/05/22 07:07

开一个数组来记录当前枚举出的字符串已经包含了每个所给的字符串多少个字符了

然后h函数为  每个所给字符串未包含的字符数的 最大值

AC代码如下:

#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>using namespace std;#define MAX 0x3f3f3f3fchar 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;}


0 0