最长公共子串(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

posted @ 2022-03-17 19:33  你的小垃圾  阅读(1671)  评论(0编辑  收藏  举报