zoukankan      html  css  js  c++  java
  • BZOJ 1264: [AHOI2006]基因匹配Match( LCS )

    序列最大长度2w * 5 = 10w, O(n²)的LCS会T.. 

    LCS 只有当a[i] == b[j]时, 才能更新答案, 我们可以记录n个数在第一个序列中出现的5个位置, 然后从左往右扫第二个序列时将第一个序列对应位置的值更新, 用树状数组维护. 时间复杂度O(nlogn) 

    -------------------------------------------------------------------------------------------------

    #include<bits/stdc++.h>
       
    #define rep(i, n) for(int i = 0; i < n; i++)
    #define clr(x, c) memset(x, c, sizeof(x))
    #define lowbit(x) ((x) & (-(x)))
     
    using namespace std;
     
    const int maxn = 20009, maxlen = 100009;
     
    vector<int> pos[maxn];
    int dp[maxlen], n, len;
     
    void modify(int p, int v) {
    for(; p <= len; p += lowbit(p))
       dp[p] = max(dp[p], v);
    }
     
    int query(int p) {
    int ans = 0;
    for(; p; p -= lowbit(p))
       ans = max(ans, dp[p]);
    return ans;
    }
     
    int main() {
    freopen("test.in", "r", stdin);
    clr(dp, 0);
    cin >> n;
    len = n * 5;
    rep(i, len) {
    int v;
    scanf("%d", &v);
    pos[v].push_back(i + 1);
    }
    rep(i, len) {
    int v;
    scanf("%d", &v);
    for(int j = 4; ~j; j--) {
    int p = pos[v][j];
    modify(p, query(p - 1) + 1);
    }
    }
    cout << query(len) << " ";
    return 0;
    }

    -------------------------------------------------------------------------------------------------

    1264: [AHOI2006]基因匹配Match

    Time Limit: 10 Sec  Memory Limit: 162 MB
    Submit: 700  Solved: 445
    [Submit][Status][Discuss]

    Description

    基因匹配(match) 卡卡昨天晚上做梦梦见他和可可来到了另外一个星球,这个星球上生物的DNA序列由无数种碱基排列而成(地球上只有4种),而更奇怪的是,组成DNA序列的每一种碱基在该序列中正好出现5次!这样如果一个DNA序列有N种不同的碱基构成,那么它的长度一定是5N。 卡卡醒来后向可可叙述了这个奇怪的梦,而可可这些日子正在研究生物信息学中的基因匹配问题,于是他决定为这个奇怪星球上的生物写一个简单的DNA匹配程序。 为了描述基因匹配的原理,我们需要先定义子序列的概念:若从一个DNA序列(字符串)s中任意抽取一些碱基(字符),将它们仍按在s中的顺序排列成一个新串u,则称u是s的一个子序列。对于两个DNA序列s1和s2,如果存在一个序列u同时成为s1和s2的子序列,则称u是s1和s2的公共子序列。 卡卡已知两个DNA序列s1和s2,求s1和s2的最大匹配就是指s1和s2最长公共子序列的长度。 [任务] 编写一个程序:  从输入文件中读入两个等长的DNA序列;  计算它们的最大匹配;  向输出文件打印你得到的结果。

    Input

    输入文件中第一行有一个整数N,表示这个星球上某种生物使用了N种不同的碱基,以后将它们编号为1…N的整数。 以下还有两行,每行描述一个DNA序列:包含5N个1…N的整数,且每一个整数在对应的序列中正好出现5次。

    Output

    输出文件中只有一个整数,即两个DNA序列的最大匹配数目。

    Sample Input

    2
    1 1 2 2 1 1 2 1 2 2
    1 2 2 2 1 1 2 2 1 1

    Sample Output

    7

    HINT

    [数据约束和评分方法]
    60%的测试数据中:1<=N <= 1 000
    100%的测试数据中:1<=N <= 20 000

    Source

  • 相关阅读:
    三数之和
    罗马数字与整数
    Oracle 开启或关闭归档
    Oracle RMAN scripts to delete archivelog
    Oracle check TBS usage
    Oracle kill locked sessions
    场景9 深入RAC运行原理
    场景7 Data Guard
    场景4 Data Warehouse Management 数据仓库
    场景5 Performance Management
  • 原文地址:https://www.cnblogs.com/JSZX11556/p/4668318.html
Copyright © 2011-2022 走看看