【动态规划】公共子串
生活随笔
收集整理的這篇文章主要介紹了
【动态规划】公共子串
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
公共子串公共子串公共子串
Description
設有A、B兩個字符串,找出A、B共同子串,每個字符串無相同字符,可以不連續,但順序不能顛倒。
Input
第一行字符串A
第二行字符串B
Output
最長公共子串的長度.
Sample Input
abcfbc
abfcab
Sample Output
4
解題方法
用i和j來枚舉A和B的當前字符,動態轉移方程如下
f[i][j]{max(f[i][j],f[i?1][j?1]+1)a[i]=b[j]max(f[i?1][j],f[i][j?1])a[i]≠b[j]f[i][j]\left\{\begin{matrix} max(f[i][j],f[i-1][j-1]+1) & a[i]=b[j]\\ max(f[i-1][j],f[i][j-1]) & a[i]\neq b[j] \end{matrix}\right.f[i][j]{max(f[i][j],f[i?1][j?1]+1)max(f[i?1][j],f[i][j?1])?a[i]=b[j]a[i]??=b[j]?
#include<cstdio> #include<iostream> #include<cstring> #include<string> using namespace std; int n,m,f[255][255]; string a,b; int main() {getline(cin,a);getline(cin,b);n=a.size();m=b.size();a=' '+a;b=' '+b;for (int i=1;i<=n;i++)for (int j=1;j<=m;j++){f[i][j]=max(f[i-1][j],f[i][j-1]);//動態轉移方程if (a[i]==b[j]) f[i][j]=max(f[i][j],f[i-1][j-1]+1);//判斷當前字符是否相同}printf("%d",f[n][m]); } 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的【动态规划】公共子串的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【贪心】最大连续数列的和
- 下一篇: 【动态规划】打砖块