PAT A1045 Favorite Color Stripe

思路:本题为 LCS 模板题的变形。原本 LCS 状态转移方程中,若 A[i] == B[j],则 dp[i][j] = dp[i - 1][j - 1] + 1(可证明)。

由于本题中可以产生重复元素匹配,此时转移方程变为 dp[i][j] = max{dp[i - 1][j], dp[i][j - 1]} + 1。

边界:dp[i][0] = dp[0][j] = 0 (0 <= i <= n, 0 <= j <= n)

//LCS
#include<cstdio>
#include<algorithm>
using namespace std;
const int MAXC = 210;
const int MAXN = 10005;

int A[MAXC], B[MAXN], dp[MAXC][MAXN];

int main() {
    int N, M;
    scanf("%d%d", &N, &M);
    for(int i = 1; i <= M; i++)
        scanf("%d", &A[i]);
    int L;
    scanf("%d", &L);
    for(int i = 1; i <= L; i++)
        scanf("%d", &B[i]);
    for(int i = 1; i <= M; i++) {
        for(int j = 1; j <= L; j++) {
            dp[i][j] = max(dp[i-1][j], dp[i][j-1]);
            if(A[i] == B[j]) dp[i][j] += 1;
        }
    }
    printf("%d", dp[M][L]);
    return 0;
}