思路:
实际上是求原序列中最长的形如1......2......1......2......的子序列的长度。令dp[i][j](1 <= j <= 4)表示在子序列a[1]至a[i]中形如前j部分的子序列的最大长度。可以使用动态规划求解。
实现:
1 #include <bits/stdc++.h> 2 using namespace std; 3 int dp[5]; 4 int main() 5 { 6 int n, d; 7 while (cin >> n) 8 { 9 memset(dp, 0, sizeof dp); 10 for (int i = 0; i < n; i++) 11 { 12 cin >> d; 13 if (d == 1) 14 { 15 dp[1]++; 16 dp[3] = max(dp[2], dp[3]) + 1; 17 } 18 else 19 { 20 dp[2] = max(dp[1], dp[2]) + 1; 21 dp[4] = max(dp[3], dp[4]) + 1; 22 } 23 } 24 int ans = -1; 25 for (int i = 1; i <= 4; i++) ans = max(ans, dp[i]); 26 cout << ans << endl; 27 } 28 return 0; 29 }