zoukankan      html  css  js  c++  java
  • 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;
    }

  • 相关阅读:
    字符集WideCharToMultiByte
    [HDF]hdf-4.2.6类库的使用
    [GDAL]读取HDF格式的calipso数据
    C#读写BitMap及颜色相乘
    [Slimdx]顶点和索引缓冲,绘制了2个分离的三角形
    [GDAL]写入shp
    几个环境学概念
    MIConvexHull
    几个力学概念
    [转载]如何破解Excel VBA密码
  • 原文地址:https://www.cnblogs.com/rainydays/p/2195580.html
Copyright © 2011-2022 走看看