最長公共子串(DP)


DP基礎_最長公共子串

Description

兩個序列的最長公共子串,這個子串要求在序列中是連續的。如:“bab”和“caba” (可以看出來最長公共子串是“ba”或者“ab”)

再如下列X和Y兩個數字序列的最長公共子串長度是5,7。

x序列:  1,5,3,2,3

Y序列: 2,3,5,3,2,5,3

所以,上述X和Y序列的最長公共子串是3。

Input

第一行:輸入一行兩個整數,表示兩個序列的長度。空格間隔開。

第二行:輸入第一個序列,以空格間隔。

第三行:輸入第二個序列,以空格間隔。

Output

輸出一個整數,表示最長公共子串的長度。

 

先上代碼

 1 #include<iostream>
 2 #include<cstdio>
 3 using namespace std;
 4 char a[1001],b[1001];
 5 int f[1001][1001];
 6 int ans;
 7 int main()
 8 {
 9     int m,n;
10     cin>>m>>n;
11     for(int i=1;i<=m;i++)
12     {
13         cin>>a[i];
14     }
15     for(int i=1;i<=n;i++)
16     {
17         cin>>b[i];
18     }
19     for(int i=1;i<=m;i++)
20     {
21         for(int j=1;j<=n;j++)
22         {
23             if(a[i]==b[j])
24             {
25                 f[i][j]=f[i-1][j-1]+1;
26                 ans=max(ans,f[i][j]);
27             }
28         }
29     }
30     cout<<ans;
31     return 0;
32 }

只要找到我們想要的狀態轉移方程就好,關鍵就是咋想呢??

我先遍歷每一個數組元素,將其分為兩種情況,其中一種就是兩個元素不相同的,我直接continue進行下一個就好,對於兩者相同的,其長度不就是兩個元素各自的數組中其前一個數的長度再加1嗎,那方程就自然而然的推出來了:f[i][j]=f[i-1][j-1]+1,然后我們只要比較每一個f[i][j],取他們的最大值就好了

2022/3/17


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM