BZOJ 1264 AHOI2006 基因匹配Match 動態規劃+樹狀數組

來源:互聯網
上載者:User

標籤:bzoj   bzoj1264   動態規劃   樹狀數組   lcs   

題目大意:給定n個數和兩個長度為n*5的序列,每個數恰好出現5次,求兩個序列的LCS

n<=20000,序列長度就是10W,樸素的O(n^2)一定會逾時

所以我們考慮LCS的一些性質

LCS的決策+1的條件是a[i]==b[j] 於是我們記錄a序列中每個數的5個位置

掃一下b[i] 對於每個b[i]找到b[i]在a中的5個位置 這5個位置的每個f[pos]值都可以被b[i]更新 於是找到f[1]到f[pos-1]的最大值+1 更新f[pos]即可

這個用樹狀數組維護 時間複雜度O(nlogn)

很難想的一道題 不過不難寫

#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#define M 200200using namespace std;int n,ans,a[M*5],b[M*5],c[M*5],f[M*5],pos[M][6];void Update(int x,int y){for(;x<=n*5;x+=x&-x)c[x]=max(c[x],y);}int Get_Ans(int x){int re=0;for(;x;x-=x&-x)re=max(re,c[x]);return re;}int main(){int i,j;cin>>n;for(i=1;i<=n*5;i++){scanf("%d",&a[i]);pos[ a[i] ][ ++pos[a[i]][0] ]=i;}for(i=1;i<=n*5;i++)scanf("%d",&b[i]);for(i=1;i<=n*5;i++){for(j=5;j;j--){int k=pos[b[i]][j];f[k]=max( f[k] , Get_Ans(k-1)+1 );Update(k,f[k]);ans=max(ans,f[k]);}}cout<<ans<<endl;}


BZOJ 1264 AHOI2006 基因匹配Match 動態規劃+樹狀數組

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.