[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 }
 
 
 

猜你喜欢

转载自www.cnblogs.com/GldHkkowo/p/8915228.html