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