1. 程式人生 > >【模板】最長公共子序列

【模板】最長公共子序列

#include <stdio.h>  
#include <string.h>  
#include <algorithm>  
using namespace std;  
  
char s1[1000],s2[1000];  
int len1,len2,dp[1000][1000],mark[1000][1000];//如果資料太大,dp陣列可以考慮滾動陣列  
  
void LCS()  
{  
    int i,j;  
    memset(dp,0,sizeof(dp));  
    for(i = 0;i<=len1;i++)  
    mark[i][0] = 1;  
    for(i = 0;i<=len2;i++)  
    mark[0][i] = -1;  
    for(i = 1; i<=len1; i++)  
    {  
        for(j = 1; j<=len2; j++)  
        {  
            if(s1[i-1]==s2[j-1])  
            {  
                dp[i][j] = dp[i-1][j-1]+1;  
                mark[i][j] = 0;  
            }  
            else if(dp[i-1][j]>=dp[i][j-1])  
            {  
                dp[i][j] = dp[i-1][j];  
                mark[i][j] = 1;  
            }  
            else  
            {  
                dp[i][j] = dp[i][j-1];  
                mark[i][j] = -1;  
            }  
        }  
    }  
}  
  
void PrintLCS(int i,int j)  
{  
    if(!i && !j)  
    return ;  
    if(mark[i][j]==0)//公共的  
    {  
        PrintLCS(i-1,j-1);  
        printf("%c",s1[i-1]);  
    }  
    else if(mark[i][j]==1)  
    {  
        PrintLCS(i-1,j);  
        printf("%c",s1[i-1]);  
    }  
    else  
    {  
        PrintLCS(i,j-1);  
        printf("%c",s2[j-1]);  
    }  
}  

相關推薦

洛谷 P1439 模板公共序列

clu () 休閑 一句話 中一 AD DC == c++ 神TM模板。。我本來想休閑一下寫點水題的。。。 開始做的時候直接敲了一個O(N2)的算法上去,編譯的時候才發現根本開不下。。 好了,談回這道題。 先不加證明的給出一種算法。 若有一組數據 2 4 2 5 1 3

luogu P1439 模板公共序列

bsp 第一個 順序 它的 amp while ++ return scan 題目qwq (第一道藍題) 據說是用了hash的思想(?) 總之是先把第一個序列每個數出現的順序記下來(其實第一個序列的數字不用記), 然後第二個序列的每個數都對照它的順序,這樣只要得到一個升序的

P1439 模板公共序列

題目描述 給出1-n的兩個排列P1和P2,求它們的最長公共子序列。 輸入輸出格式 輸入格式: 第一行是一個數n, 接下來兩行,每行為n個數,為自然數1-n的一個排列。 輸出格式: 一個數,即最長公共子序列的長度 輸入輸出樣例 輸入樣例#1: 複製 5 3 2 1 4 5 1 2 3 4 5

洛谷P1439 模板公共序列

1-n ont range else 輸入輸出格式 pac algo mes 格式 題目描述 給出1-n的兩個排列P1和P2,求它們的最長公共子序列。 輸入輸出格式 輸入格式: 第一行是一個數n, 接下來兩行,每行為n個數,為自然數1-n的一個排列。 輸出格式:

模板公共序列(LCS)。

ons 理解 思路 esp 自動 const () -- bing 看過好多人的博客,感覺要麽是太復雜要麽就是太不容易理解。 那就親自動手寫一個通俗易懂的。 先定義兩個數組,第一個數組為主,用第二個數組來匹配第一個,看能有多少可以對應上的。 所以,其實第一個數組的內容可以暫

模板公共序列

#include <stdio.h> #include <string.h> #include <algorithm> using namespace

[題解]洛谷P1439 模板公共序列

序列 printf %d span pac namespace int turn esp 原題 原題 思路 將第一個序列依次從左到右標號,然後映射到第二個序列中 因為第一個序列標號只上升的所以問題就轉化為序列2標號後的最長上升子序列 代碼 #include&

洛谷 P1439 模板公共序列 題解

inf bubuko return https == span ++ 每一個 upper 題目傳送門 看起來是一道十分經典的LCS問題 很容易想到 n2 的一般算法:主題代碼如下: for (int i = 1; i <= n; i++) fo

DP公共序列

amp 給定 scrip ros script print 最長 去掉 != Description   字符序列的子序列是指從給定字符序列中隨意地(不一定連續)去掉若幹個字符(可能一個也不去掉)後所形成的字符序列。令給定的字符序列X=“x0,x1,…,xm-1”,序列Y

mark公共序列(poj 1458+hdu 1159)

經典的問題,在各大部落格上有數不清的好帖子 下面為最常見的n^2演算法 #include<cstdio> #include<cstring> #include<cmath> #include<cstdlib> #inclu

動態規劃公共序列問題

clas == 搜索 ios for 參考 pan 公式 是否 題目描述: 給定兩個字符串s1s2……sn和t1t2……tn。求出這兩個字符串最長的公共子序列的長度。字符串s1s2……sn的子序列指可以表示為si1si2……sim(i1<i2<……<im)

例9.9公共序列

std 不存在 cst i++ 公共子串 ostream ont enter http 【例9.9】最長公共子序列 鏈接:http://ybt.ssoier.cn:8088/problem_show.php?pid=1265 時間限制: 1000 ms 內

NOJ1041DP_動態規劃公共序列

1041.最長公共子序列 時限:1000ms 記憶體限制:200000K  總時限:3000ms 描述 一個給定序列的子序列是在該序列中刪去若干元素後得到的序列。確切地說,若給定序列X=<x1, x2,…, xm>,則另一序列Z=<z1, z2,

經典動態規劃問題公共序列LCS

目錄 題目 題目分析 狀態 邊界值討論 其他情況討論 程式碼實現 從題目出發分析如何用動態規劃求解最長公共子序列問題 題目 給定兩個字串A和B,返回兩個字串的最長公共子序列的長度。例如,A="1A2C3D4B56”,B="B1D23CA45B6A”,”1234

動態規劃公共序列公共

1. 問題描述 子串應該比較好理解,至於什麼是子序列,這裡給出一個例子:有兩個母串 cnblogs belong 比如序列bo, bg, lg在母串cnblogs與belong中都出現過並且出現順序與母串保持一致,我們將其稱為公共子序列。最長公共子序列(Longest Common Subsequence

水:公共序列HDU1159Common Subsequence

Common Subsequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 24919    Acc

HDU 1159 DP之公共序列

類似於字典序比較的最長公共子序列, 只要找到狀態方程就比較好搞, 從角標1開始計算不會出錯,從0還是報錯了; 切防止對比溢位要在本來的基礎上+1計算; 言歸正傳: DP型別都是狀態方程很重要; 假設兩

HDU 1159 基礎DP 公共序列

TAT,,,覺得自己不算太理解,但是居然可以憑著記憶做出來。。蠻拼的 #include <cstdio> #include <cstring> #include <iostream> #include <string> usi

bzoj5161上升序列 狀壓dp+打表

-s 只需要 [] sca div limits pow 證明 AC 題目描述 現在有一個長度為n的隨機排列,求它的最長上升子序列長度的期望。 為了避免精度誤差,你只需要輸出答案模998244353的余數。 輸入 輸入只包含一個正整數n。N<=28 輸出

bzoj3173上升序列

節點 return hup 位置 一個 ostream online %d pre Portal --> bzoj3173 Solution   感覺自己需要智力康復qwq   首先題目給的這個序列肯定是一個\(1-n\)的排列,並且插入的順序是從小到大   仔細思考