这道题可以算是搜索中的一个经典题型了;
在做这道题之前,可以先了解一下A*算法和迭代深搜的思想;
这个题只用迭代深搜是一定会超时的,需要加上剪枝:当前搜索深度+预计还要搜索的深度 < 当前设定的深度上限值
这其中其实是体现了A*算法的思想
——传说中的IDA*?
吐槽:这个题 无论用什么方法写 最坏情况应该是都会超时的 233
比方说这一组数据:
1
4
AAAA
TTTT
CCCC
GGGG
本地跑是完全会超时的 评测系统应该是没有这么强的数据
再强一点的话
1
4
AAAAA
TTTTT
CCCCC
GGGGG
本地已经跑不出来了
#include <bits/stdc++.h>
using namespace std;
string s[8];
int len[8];
int ans,dep,t,n;
char DNA[10] = {"ATCG"};
int ca;
void dfs(int cur,int now[]){
if (cur >= dep) return;
int hn = 0;//因为这一步骤实质上就是求h(n)索性就这么起变量名
for (int i = 0; i < n; i++) hn = max(hn,len[i]-now[i]);
if (!hn) {
ans = cur;
return;
}
if (cur+hn>=dep) return ;//可以试一下将这一句注释掉跑的时间
int flag = 0;
int t[8] = {0};
for (int i = 0; i < 4; i++) {
for (int j = 0; j < n; j++) {
if (DNA[i] == s[j][now[j]]) {
flag = 1;
t[j] = now[j]+1;
}
else t[j] = now[j];
}
if(flag) dfs(cur+1,t);
if(ans) break;
}
}
int main() {
// clock_t start,end;
// start = clock();
// freopen("in.txt", "r", stdin);
cin >> t; while(t--){
cin >> n;
dep=0;
for (int i = 0; i < n; i++) {
cin >> s[i];
len[i] = s[i].size();
dep = max(dep,len[i]);
}
int now[8] = {0};
ans = 0;
while(1){
dfs(0,now);
if(ans) break;
else dep++;
}
cout << ans <<endl;
}
// end = clock();
// cout << end-start <<endl;
return 0;
}
/*
1
4
AAAA
TTTT
CCCC
GGGG
这组会完美的超时
*/