这道题明显是一道搜索题。我一开始使用的是bfs,结果老是爆内存,怎么修改参数都过不了,最后,我去看了别人的题解,才知道还有迭代深搜这种东西。所以这题就用迭代深搜来做。
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> using namespace std; int pos[10] = { 0 }; int siz[10] = { 0 }; char s[10][10]; int n; int deep; int ans = 0; char tmp[5] = { ' ','A','G','C','T' }; void dfs(int step, int *len) { //cout << step <<endl; //for (int i=0;i<=n;i++) cout << len[i] << " "; //cout <<endl; if (step > deep) return; int maxn = 0; for (int i = 0; i < n; i++) { maxn = max(maxn, siz[i] - len[i]); } if (step + maxn > deep) return; if (!maxn) { ans = step; return; } //cout <<maxn <<endl; for (int i = 1; i <= 4; i++) { int f = 0; int p[10] = {0}; for (int j = 0; j < n; j++) { //cout << s[j][len[j]] << endl; if (s[j][len[j]] == tmp[i]) { f = 1; p[j] = len[j] + 1; //cout << p[j] <<endl; } else { p[j] = len[j]; } } if (f) { dfs(step + 1, p); } if (ans) return; } } int main() { int t;cin >>t; while (t--) { cin >> n; ans = 0; int maxn = 0; for (int i = 0; i < n; i++) { scanf("%s", s[i]); //cout << s[i] << endl; siz[i] = strlen(s[i]); maxn = max(maxn,siz[i]); pos[i] = 0; } deep = maxn; while (1) { //cout <<deep <<endl; dfs(0, pos); if (ans) break; deep++; } cout << ans << endl; } return 0; }
大体思路就是 每次迭代,判断该次能够对每个字符串覆盖多少字符,其值保存在pos中(也在dfs的len中),一直迭代到能够覆盖所有的字符串为止,一旦找到,即为最短,故其中有广搜的思想。