找到一串序列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; }