zoukankan      html  css  js  c++  java
  • [DP][NOIP2013]花匠

    花匠

    问题描述:

           花匠栋栋种了一排花,每株花都有自己的高度。花儿越长越大,也越来越挤。栋栋决定把这排中的一部分花移走,将剩下的留在原地,使得剩下的花能有空间长大,同时,栋栋希望剩下的花排列得比较别致。

    具体而言,栋栋的花的高度可以看成一列整数ℎ1, ℎ2, … , ℎn。设当一部分花被移走后,剩下的花的高度依次为g1,g2,… , gm,则栋栋希望下面两个条件中至少有一个满足:

    条件 A:对于所有的1≤i≤,有g2i  >g2i-1,同时对于所有的1≤i≤,有g2i  >g2i+1

    条件 B:对于所有的1≤i≤,有g2i  < g2i-1,同时对于所有的1≤i≤,有g2i  <g2i+1

    注意上面两个条件在 m = 1时同时满足,当m > 1时最多有一个能满足。

    请问,栋栋最多能将多少株花留在原地。

    输入

    输入文件为flower.in。
    输入的第一行包含一个整数n,表示开始时花的株数。
    第二行包含n个整数,依次为ℎ1, ℎ2,…, ℎn,表示每株花的高度。

    输出

    输出文件为flower.out。
    输出一行,包含一个整数m,表示最多能留在原地的花的株数。

    样例输入

    5 
    5 3 2 1 2 

    样例输出

    3


    f[i][0]表示前i株花中的最后一株满足条件A时的最多剩下的株数,f[i][1]表示前i株花作为序列终点且最后一株(不一定是i)满足条件B时的最多剩下的株数,可以得到:
    h[i]>h[i 1]时,
    f[i][0] = max{f[i1][0],f[i1][1]+1}, f[i][1] = f[i1][1]
    h[i] == h[i−1]时:
    f[i][0] = f[i1][0],f[i][1] = f[i1][1];
    h[i]<h[i1]时:
    f[i][0]=f[i1][0],f[i][1]=max{f[i1][1],f[i1][0]+1}
    答案ans=max{f[n][0],f[n][1]};
    边界为f[1][0]=f[1][1]

    代码:
     1 #include<algorithm>
     2 #include<cstdio>
     3 const int Maxv = 100010; 
     4 int h[Maxv], f[Maxv][2]; 
     5 
     6 inline int read(){
     7     int x = 0, f = 1;
     8     char ch = getchar(); 
     9     while (ch < '0' || ch > '9') {
    10         if (ch == '-') {
    11             f = -1; 
    12         }
    13         ch = getchar(); 
    14     }
    15     while (ch >= '0' && ch <= '9') {
    16         x = x * 10 + c - '0'; 
    17         ch = getchar(); 
    18     }
    19     return x * f; 
    20 }
    21 
    22 int main(){
    23     int n; 
    24     n = read(); 
    25     for (int i = 1; i <= n; i++) {
    26         f[i][0] = f[i][1] = 0; 
    27         h[i] = read(); 
    28     }
    29     for (int i = 1; i <= n; i++) {
    30         for (int j = i - 1; j > 0; j--) {
    31             if (h[j] > h[i]) {
    32                 f[i][0] = std::max(f[j][0] + 1, f[i][0]); 
    33             }
    34             if (h[j] < h[i]) {
    35                 f[i][1] = std::max(f[j][0] + 1, f[i][1]); 
    36             }
    37             if (f[i][0] != 1 && f[i][1] != 1) {
    38                 break; 
    39             }
    40         }
    41     }
    42     printf("%d", std::max(f[n][0], f[n][1])); 
    43     return 0; 
    44 }
    
    
    
     
  • 相关阅读:
    AOP
    session的一些原理
    HttpContext.Cache和Application的区别
    什么是COM组件
    MS—SQL数据库索引的应用
    会话状态(转)
    LINQ体验(6)——LINQ语句之Join和Order By(转)
    永远不停止学习,才是程序员最大的财富,欢迎加入CMS研究室
    面向对象
    从瀑布型开发到迭代型开发的转变
  • 原文地址:https://www.cnblogs.com/GldHkkowo/p/8915228.html
Copyright © 2011-2022 走看看