C++最长公共子序列问题

#include 
#include 
using namespace std;

const int MAXN = 1005;
int dp[MAXN][MAXN];

int main()
{
    string s1, s2;
    cin >> s1 >> s2;
    int len1 = s1.length(), len2 = s2.length();

    memset(dp, 0, sizeof(dp)); // 初始化为0

    // 动态规划求解
    for (int i = 1; i <= len1; i++) {
        for (int j = 1; j <= len2; j++) {
            if (s1[i-1] == s2[j-1]) {
                dp[i][j] = dp[i-1][j-1] + 1;
            }
            else {
                dp[i][j] = max(dp[i-1][j], dp[i][j-1]);
            }
        }
    }

    cout << dp[len1][len2] << endl; // 输出最长公共子序列的长度

    return 0;
}

        该代码使用了动态规划的思想来解决最长公共子序列问题。dp[i][j]表示s1字符串前i个字符与s2字符串前j个字符的最长公共子序列长度。状态转移方程为:

​if (s1[i-1] == s2[j-1]) {
    dp[i][j] = dp[i-1][j-1] + 1;
}
else {
    dp[i][j] = max(dp[i-1][j], dp[i][j-1]);
}

        如果s1[i-1] == s2[j-1],则说明s1[i-1]和s2[j-1]可以作为最长公共子序列的最后一个字符,此时dp[i][j]应该为dp[i-1][j-1]+1;否则,s1[i-1]和s2[j-1]不能同时作为最长公共子序列的最后一个字符,此时dp[i][j]应该为dp[i-1][j]和dp[i][j-1]中的最大值。最终,dp[len1][len2]就是最长公共子序列的长度。

你可能感兴趣的:(C++更多语法,c++入门必备,c++,开发语言)