codeforces 934C 区间DP

codeforces 934C


题意:

n ( 1 2 给定一串长度为n的数字(只含1和2),你可以翻转任意区间。
问若干次操作后最长不下降子序列的长度。


题解:

d p [ i ] [ j ] [ 1 , i ] j ( 1111 , 1122 , 2211 , 2222 ) dp[i][j]表示区间[1,i]以第j种形式(1111,1122,2211,2222)出现时的最长不下降子序列长度。

  • d p [ i ] [ j ] = m a x ( d p [ i 1 ] [ j ] + ( x = = 1 + ( j 1 ) % 2 ) , d p [ i ] [ j 1 ] ) 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; 
}

猜你喜欢

转载自blog.csdn.net/CSDN_PatrickStar/article/details/89739937