找到一串序列a中的一段最长子序列,子序列满足x,y,x,y,x,y...交替的形式。

dp[i][j] 表示以a[i]为开始a[j]为结尾的最长交替子序列

dp[i][j] = dp[j][k] + 1 (a[i] == a[k] 形成交替)

#include <bits/stdc++.h>
using namespace std;
const int maxn = 4005;
int dp[maxn][maxn];
int a[maxn];
int main() {
    int n;
    cin >> n;
    for (int i = 1; i<= n; i++) cin >> a[i];
    for (int i = 1; i <= n; i++) dp[i][0] = 1;
    int ans = 1;
    for (int i = n; i >= 1; i--) { //从后往前枚举
        for (int j = n, k = 0; j > i; j--) {
            dp[i][j] = dp[j][k] + 1;
            if (a[i] == a[j]) k = j; //是否有出现与a[i]相等,相等说明可以在这个位置进行交替
            ans = max(ans, dp[i][j]);
        }
    }
    cout << ans << endl;
    return 0;
}