codeforces 934C 区间DP

codeforces 934C


题意:

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


题解:

d p [ i ] [ j ] 表 示 区 间 [ 1 , i ] 以 第 j 种 形 式 ( 1111 , 1122 , 2211 , 2222 ) 出 现 时 的 最 长 不 下 降 子 序 列 长 度 。 dp[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]) dp[i][j]=max(dp[i1][j]+(x==1+(j1)%2),dp[i][j1])

#include 
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; 
}

你可能感兴趣的:(区间DP)