H - DNA sequence (poj 1560)

这道题明显是一道搜索题。我一开始使用的是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中),一直迭代到能够覆盖所有的字符串为止,一旦找到,即为最短,故其中有广搜的思想。

猜你喜欢

转载自www.cnblogs.com/cuizhihui/p/10900992.html