zoukankan      html  css  js  c++  java
  • Codeforces 934 C.A Twisty Movement-前缀和+后缀和+动态规划

    C. A Twisty Movement
     
    time limit per test
    1 second
    memory limit per test
    256 megabytes
    input
    standard input
    output
    standard output

    A dragon symbolizes wisdom, power and wealth. On Lunar New Year's Day, people model a dragon with bamboo strips and clothes, raise them with rods, and hold the rods high and low to resemble a flying dragon.

    A performer holding the rod low is represented by a 1, while one holding it high is represented by a 2. Thus, the line of performers can be represented by a sequence a1, a2, ..., an.

    Little Tommy is among them. He would like to choose an interval [l, r] (1 ≤ l ≤ r ≤ n), then reverse al, al + 1, ..., ar so that the length of the longest non-decreasing subsequence of the new sequence is maximum.

    A non-decreasing subsequence is a sequence of indices p1, p2, ..., pk, such that p1 < p2 < ... < pk and ap1 ≤ ap2 ≤ ... ≤ apk. The length of the subsequence is k.

    Input

    The first line contains an integer n (1 ≤ n ≤ 2000), denoting the length of the original sequence.

    The second line contains n space-separated integers, describing the original sequence a1, a2, ..., an (1 ≤ ai ≤ 2, i = 1, 2, ..., n).

    Output

    Print a single integer, which means the maximum possible length of the longest non-decreasing subsequence of the new sequence.

    Examples
    input
    Copy
    4
    1 2 1 2
    output
    4
    input
    Copy
    10
    1 1 2 2 2 1 1 2 2 1
    output
    9
    Note

    In the first example, after reversing [2, 3], the array will become [1, 1, 2, 2], where the length of the longest non-decreasing subsequence is 4.

    In the second example, after reversing [3, 7], the array will become [1, 1, 1, 1, 2, 2, 2, 2, 2, 1], where the length of the longest non-decreasing subsequence is 9.

     
    这个题就是找的是反转区间之后的最长非递增子序列,并不是连续的。。。
    其实就是把区间分成三部分,前一部分统计1的个数,后一部分统计2的个数,中间那一部分反转然后找最长的就可以。
    前缀和记录1的个数,后缀和记录2的个数,动态规划操作中间那一部分找最长的。
     
    代码:
     1 //C-用dp写
     2 #include<iostream>
     3 #include<cstring>
     4 #include<cstdio>
     5 #include<cmath>
     6 #include<algorithm>
     7 #include<cstdlib>
     8 using namespace std;
     9 const int maxn=2000+10;
    10 int dp[maxn][maxn][2];
    11 int p1[maxn],p2[maxn],a[maxn];
    12 int main(){
    13     int n;
    14     scanf("%d",&n);
    15     p1[0]=0;p2[n+1]=0;
    16     for(int i=1;i<=n;i++){
    17         scanf("%d",&a[i]);
    18         p1[i]=p1[i-1];
    19         if(a[i]==1)p1[i]++;
    20     }
    21     for(int j=n;j>=1;j--){
    22         p2[j]=p2[j+1];
    23         if(a[j]==2)p2[j]++;
    24     }
    25     int ans=-1;
    26     for(int i=1;i<=n;i++){
    27         for(int j=i;j<=n;j++){
    28             if(a[j]==2)dp[i][j][1]=dp[i][j-1][1]+1;
    29             else dp[i][j][1]=dp[i][j-1][1];
    30             if(a[j]==1)dp[i][j][0]=max(dp[i][j-1][0],dp[i][j-1][1])+1;
    31             else dp[i][j][0]=max(dp[i][j-1][0],dp[i][j-1][1]);
    32             ans=max(p1[i-1]+p2[j+1]+dp[i][j][1],max(ans,p1[i-1]+p2[j+1]+dp[i][j][0]));
    33         }
    34     }
    35     printf("%d
    ",ans);
    36 }

    不用动态规划也可以直接模拟。

    继续。

  • 相关阅读:
    IOS开发之UIview
    poj2823(单调队列)
    poj3250(单调栈)
    poj2796(单调栈+树状数组)
    hdu5033(单调栈)
    hdu1506(单调栈)
    2018 Multi-University Training Contest 2
    hdu4417(主席树)
    2018 Multi-University Training Contest 1
    poj2104(主席树)
  • 原文地址:https://www.cnblogs.com/ZERO-/p/9723051.html
Copyright © 2011-2022 走看看