LCS最长公共子串:线性dp
LCS最长公共子串 题目: 有两个字符串,串T为ABCBDAB,而串S为BDCABA,求最长公共子串的长度: 首先我们分析,如果有两个字符Ti和Sj,就有以下公式: dp[i][j]=dp[i-1][j-1]+1; T[i]==S[j]; dp[i][j]=max(dp[i-1][j],dp[i][j-1]); T[i]!=S[j]; 可以带本题例子证出,这里就不说明了。 代码: # include <cstdio> # include <cstring> # include <algorithm> using namespace std ; const int MAXN = 1e3 ; char a [ MAXN ] , b [ MAXN ] ; int dp [ MAXN ] [ MAXN ] ; void LCS ( int n , int m ) { for ( int i = 1 ; i <= n ; i ++ ) for ( int j = 1 ; j <= m ; j ++ ) dp [ i ] [ j ] = a [ i ] == b [ j ] ? dp [ i - 1 ] [ j - 1 ] + 1 : max ( dp [ i - 1 ] [ j ] , dp [ i ] [ j - 1 ] ) ; } int main ( ) { scanf ( "%s%s