最长公共子序列
解题思路
此题是经典的动态规划题,直接给出状态转移方程
if( a(m) == b(n) )
dp[m][n] = dp[m-1][n-1] + 1
else
dp[m][n] = max(dp[m-1][n], dp[m][n-1])
代码
#include<iostream>
#include <vector>
using namespace std;
class Solution {
public:
/**
* @param A: A string
* @param B: A string
* @return: The length of longest common subsequence of A and B
*/
int longestCommonSubsequence(string &A, string &B) {
// write your code here
int len1 = A.length();
int len2 = B.length();
vector<vector<int> > dp(len2+1, vector<int>(len1+1, 0));
for(int i=1;i<len2+1;i++)
{
for(int j=1;j<len1+1;j++)
{
if(A[j] == B[i])
{
dp[i][j] = dp[i-1][j-1] + 1;
}
else
{
dp[i][j] = max(dp[i-1][j], dp[i][j-1]);
}
cout<<i<<" "<<j<<endl;
}
}
return dp[len2][len1];
}
};
int main()
{
string s1 = "12342343535";
string s2 = "23123425";
Solution solution;
cout<<solution.longestCommonSubsequence(s1, s2)<<endl;
}