poj1699

题意:给定若干基因片段,求包含所有片段的最短基因序列长度。

分析:cost[i][j]表示把j串接在i穿后面最少需要添加几个字符,先求出整个cost矩阵,然后枚举这些串的全排列,对于每种排列求长度,更新最小值。

View Code
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;

#define maxn 15
#define maxl 25

int n;
char gene[maxn][maxl];
int cost[maxn][maxn];
int f[maxn];

void input()
{
scanf("%d", &n);
for (int i = 0; i < n; i++)
scanf("%s", gene[i]);
}

int cal(char *st1, char *st2)
{
int len1 = strlen(st1);
int len2 = strlen(st2);
for (int i = len1 - len2; i < len1; i++)
{
bool ok = true;
for (int j = i; j < len1; j++)
if (st1[j] != st2[j - i])
{
ok = false;
break;
}
if (ok)
return len2 + i - len1;
}
return len2;
}

void make()
{
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
cost[i][j] = cal(gene[i], gene[j]);
}

void work()
{
for (int i = 0; i < n; i++)
f[i] = i;
int ans = 0x3f3f3f3f;
do
{
int temp = strlen(gene[f[0]]);
for (int i = 0; i < n - 1; i++)
temp += cost[f[i]][f[i + 1]];
ans = min(ans, temp);
} while (next_permutation(f, f + n));
printf("%d\n", ans);
}

int main()
{
//freopen("t.txt", "r", stdin);
int t;
scanf("%d", &t);
while (t--)
{
input();
make();
work();
}
return 0;
}

你可能感兴趣的:(poj)