POJ 1458 Common Subsequence

题意:LCS……最长公共子序列……不想解释了

解法:这题只需要求长度,所以显而易见(对没错我就是来装×的),方程为dp[i][j] = {dp[i - 1][j - 1] + 1(s1[i] == s2[i]), max(dp[i - 1][j], dp[i][j - 1])}。

好吧还是解释一下……dp[i][j]表示两个字符串分别以第i个元素和第j个元素结尾时的LCM长度,如果第一个字符串的第i个字符和第二个字符串的第j个字符相等,那么dp[i][j]由dp[i - 1][j - 1]转移而来,否则dp[i][j]为dp[i][j - 1]和dp[i - 1][j]的最大值。

代码:

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string>
#include<string.h>
#include<math.h>
#include<limits.h>
#include<time.h>
#include<stdlib.h>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<vector>
#define LL long long
using namespace std;
int dp[1005][1005];
int main()
{
    string s1, s2;
    while(cin >> s1 >> s2)
    {
        memset(dp, 0, sizeof dp);
        for(int i = 1; i <= s1.size(); i++)
        {
            for(int j = 1; j <= s2.size(); 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[s1.size()][s2.size()] << endl;
    }
    return 0;
}

  

原文地址:https://www.cnblogs.com/Apro/p/4481347.html