HDU 1560 迭代加深

/*
IDA*会MLE,用的迭代加深搜索。
具体来说就是设一个可以搜索的最大深度
如果当前搜索到的深度加上预测还要搜索的深度大于这个最大深度,则不继续进行搜索
否则继续搜索,如果搜到底,则说明这个深度合法,即答案。
*/

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 10;
int len[MAXN];
int data[MAXN][MAXN];
char str[MAXN];
int cur[MAXN];
int n;
int toI(char c)
{
    if(c == 'A') return 0;
    else if(c == 'C') return 1;
    else if(c == 'G') return 2;
    else return 3;
}
int deep;
int geth()
{
    int ans = 0;
    for(int i = 0 ; i < n ; i++) ans = max(ans, len[i] - cur[i]);
    return ans;
}
int vis[MAXN];
bool dfs(int step, int rest)
{
    if(step + geth() > deep) return 0;
    else if(rest == 0) return 1;
    int tcur[MAXN];
    for(int j = 0 ; j < n ; j++) tcur[j] = cur[j];
    for(int i = 0 ; i < 4 ; i++) {
        int cost = 0;
        for(int j = 0 ; j < n ; j++) {
            if(cur[j] < len[j] && i == data[j][cur[j]]) {
                cost++;
                cur[j]++;
            }
        }
        if(cost == 0) continue;
        else if(dfs(step + 1, rest - cost)) {
// printf("step = %d i = %d, rest = %d, cost = %d\n", step, i, rest, cost);
// for(int j = 0 ; j < n ; j++) printf("%d ", vis[j]);
// puts("");
            return 1;
        }
        for(int j = 0 ; j < n ; j++) cur[j] = tcur[j];
    }
    return 0;
}
int main()
{
    int T;
    scanf("%d", &T);
    while(T--) {
        scanf("%d", &n);
        deep = 0;
        int rest = 0;
        for(int i = 0 ; i < n ; i++) {
            scanf("%s", str);
            len[i] = strlen(str);
            deep = max(deep, len[i]);
            for(int j = 0 ; j < len[i] ; j++) data[i][j] = toI(str[j]);
            rest += len[i];
        }
        memset(cur, 0, sizeof cur);
// memset(vis, 0, sizeof vis);
        while(1) {
            if(dfs(0, rest)) break;
            deep++;
        }
        printf("%d\n", deep);
    }
    return 0;
}

你可能感兴趣的:(HDU 1560 迭代加深)