【c++】【算法】【动态规划】最长公共子序列
int FindValue(const string& X, const string& Y, int i, int j)
{
if (i == 0 || j == 0)return 0;
if (X[i] == Y[j])return FindValue(X, Y, i - 1, j - 1)+1;
else return std::max(FindValue(X, Y, i, j - 1), FindValue(X, Y, i - 1, j));
}
int FindValue1(const string& X, const string& Y, vector<vector<int>>& vec, int i, int j)
{
if (i <= 0 || j <= 0)return 0;
if (vec[i][j] > 0)return vec[i][j];
else if (X[i] == Y[j])
{
vec[i][j] = FindValue1(X, Y, vec, i - 1, j - 1)+1;
}
else
{
int t1= FindValue1(X, Y, vec, i, j - 1);
int t2= FindValue1(X, Y, vec, i-1, j);
vec[i][j] = max(t1, t2);
}
return vec[i][j];
}
void printLCS(int i, int j, const string& X, const string& Y, vector<vector<int>>& dp, string& lcs) {
if (i <=0 || j <=0) {
return;
}
if (X[i] == Y[j]) {
lcs = X[i] + lcs;
printLCS(i - 1, j - 1, X, Y, dp, lcs);
}
else {
if (dp[i - 1][j] >= dp[i][j - 1]) {
printLCS(i - 1, j, X, Y, dp, lcs);
}
else {
printLCS(i, j - 1, X, Y, dp, lcs);
}
}
}
int FindValue2(const string& X, const string& Y, vector<vector<int>>& vec, vector<vector<int>>& dest, int i, int j)
{
if (i <= 0 || j <= 0)return 0;
if (vec[i][j] >0 )return vec[i][j];
else if (X[i] == Y[j])
{
vec[i][j] = FindValue2(X, Y, vec, dest, i - 1, j - 1) + 1;
dest[i][j] = 1;
}
else
{
int t1 = FindValue2(X, Y, vec, dest, i - 1, j);
int t2 = FindValue2(X, Y, vec, dest, i, j - 1);
if (t1 > t2)
{
vec[i][j] = t1;
dest[i][j] = 2;
}
else
{
vec[i][j] = t2;
dest[i][j] = 3;
}
}
return vec[i][j];
}
void Print(vector<vector<int>>& vec)
{
int n = vec.size();
for (int i = 1;i < n;i++)
{
for (int j = 1;j < vec[i].size();j++)
{
cout << vec[i][j] << " ";
}
cout << endl;
}
}
void printPublicSub(vector<vector<int>>& dest, int i, int j,string&X)
{
if (i <= 0 || j <= 0)return;
if (dest[i][j] == 1)
{
printPublicSub(dest, i - 1, j - 1,X);
cout << X[i] << " ";
}
else if (dest[i][j] == 2)
{
printPublicSub(dest, i - 1, j, X);
}
else
{
printPublicSub(dest, i, j-1, X);
}
}
int FindValue3(const string& X, const string& Y, int m, int n)
{
vector<vector<int>>dp(m + 1, vector<int>(n + 1, 0));
for (int i = 1;i <= m;i++)
{
for (int j = 1;j <= n;j++)
{
if (X[i - 1] == Y[j - 1])
{
dp[i][j] = dp[i - 1][j - 1] + 1;
}
else
{
dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
}
}
}
return dp[m][n];
}
int FindValue4(const string& X, const string& Y, int m, int n,string &lcs)
{
vector<vector<int>>dp(m + 1, vector<int>(n + 1, 0));
for (int i = 1;i <= m;i++)
{
for (int j = 1;j <= n;j++)
{
if (X[i - 1] == Y[j - 1])
{
dp[i][j] = dp[i - 1][j - 1] + 1;
}
else
{
dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
}
}
}
int i = m, j = n;
while (i > 0 && j > 0) {
if (X[i] == Y[j]) {
lcs = X[i - 1] + lcs;
i--;
j--;
}
else if (dp[i - 1][j] > dp[i][j - 1]) {
i--;
}
else {
j--;
}
}
return dp[m][n];
}
int main()
{
string X = "#ABCBDAB";
string Y = "#BDCABA" ;
int i = X.size()-1;
int j = Y.size()-1;
vector<vector<int>>vec1(i + 1, vector<int>(j + 1, 0));
}