您的位置:首页 > 其它

[Noip2013] 花匠

2018-03-04 19:58 197 查看

Description

花匠栋栋种了一排花,每株花都有自己的高度。花儿越长越大,也越来越挤。栋栋决定

把这排中的一部分花移走,将剩下的留在原地,使得剩下的花能有空间长大,同时,栋栋希

望剩下的花排列得比较别致。

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

条件 A:对于所有g(2*i)>g(2*i-1),g(2*i)>g(2*i+1)

条件 B:对于所有g(2*i)<g(2*i-1),g(2*i)<g(2*i+1)

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

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

Input

输入的第一行包含一个整数n,表示开始时花的株数。

第二行包含n个整数,依次为h1,h2..hn,表示每株花的高度。

Output

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

Range

对于 100%的数据,1 ≤ n ≤ 100,000,0 ≤ hi≤ 1,000,000,所有的hi 随机生成,所有随机数服从某区间内的均匀分布。

Solution

这种像dp的贪心贼坑人=.=

简化一下题意,这题实际上就是求最长的一段波浪序列(每一盆花都是波峰或波谷)。

定义 f[i][0/1] 表示到前 i 盆花(注意不一定包含i),1 说明在波谷时的最长序列,0 则是在波峰。那么转移方程就出来了:

if(val[i]>val[i-1]) f[i][0]=f[i-1][1]+1;
else f[i][0]=f[i-1][0];
if(val[i]<val[i-1]) f[i][1]=f[i-1][0]+1;
else f[i][1]=f[i-1][1];

Code

#include<cstdio>
#include<iostream>
#define N 100005
using namespace std;

int n;
int val
;
int f
[2];

signed main(){
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&val[i]);
f[1][0]=f[1][1]=1;
for(int i=2;i<=n;i++){
if(val[i]>val[i-1]) f[i][0]=f[i-1][1]+1;
else f[i][0]=f[i-1][0];
if(val[i]<val[i-1]) f[i][1]=f[i-1][0]+1;
else f[i][1]=f[i-1][1];
}
printf("%d",max(f
[1],f
[0]));
return 0;
}

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: