蓝桥杯 最长公共子序列

注意维护两列 , 但是并不需要反复粘贴行 , 利用cur ^=1来复用

代码

#include<bits/stdc++.h>
using namespace std;

inline int read() {
    int ans = 0, f = 1;
    char ch = getchar();
    while (ch < '0' || ch > '9') {
        if (ch == '-')f = -1;
        ch = getchar();
    }
    while (ch <= '9' && ch >= '0') {
        ans = ans * 10 + ch - '0';
        ch = getchar();
    }
    return ans * f;
}
const int N = 1e3+10;
int a[N],b[N];
int dp[N][2];
int main() {
    int cur = 0;
    int n=read(),m=read();
    for (int i =1; i<= n;i++)a[i] =read();
    for (int j = 1; j<= m;j++) b[j] =read();
    for (int i = 1; i<= n; i++) {
        for (int j = 1; j<= m; j++) {
            if (a[i] != b[j]) dp[j][cur] = max(dp[j-1][cur],dp[j][cur^1]);
            else dp[j][cur] = dp[j-1][cur^1]+1;
        }
        cur ^= 1;
    }
    cout<<dp[m][cur^1]<<"\n";
    return 0;
}
posted @ 2025-06-01 14:29  Guaninf  阅读(10)  评论(0)    收藏  举报