找到一串序列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;
} 
京公网安备 11010502036488号