题意:
给定一串长度为n的数字(只含1和2),你可以翻转任意区间。
问若干次操作后最长不下降子序列的长度。
题解:
dp[i][j]表示区间[1,i]以第j种形式(1111,1122,2211,2222)出现时的最长不下降子序列长度。
-
dp[i][j]=max(dp[i−1][j]+(x==1+(j−1)%2),dp[i][j−1])
#include <bits\stdc++.h>
using namespace std;
const int N = 2001;
int dp[N][5];
int main() {
int n, x;
cin >> n;
for(int i = 1 ; i <= n ; i++){
cin >> x;
for(int j = 1 ; j <= 4 ; j++){
dp[i][j] = max(dp[i-1][j]+(x == 1+(j-1)%2), dp[i][j-1]);
}
}
cout << dp[n][4] << endl;
return 0;
}