[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; }
相关文章推荐
- NOIP2013 花匠解题报告
- [NOIP2013]花匠
- [NOIP 2013]花匠
- 【NOIP2013提高组】花匠
- NOIP 2013 D2T2 花匠
- 【noip2013】花匠 DP||贪心
- noip2013提高组 花匠
- 【NOIP2013提高组】花匠
- [模拟][NOIP 2013]花匠
- luogu1970 花匠(NOIP2013提高组第5题)
- COGS 1441 NOIP 2013 花匠
- NOIP2013 花匠
- 【NOIP】2013提高组 花匠(摆花)
- [noip2013]花匠 题解
- Noip2013花匠题解
- [NOIP2013 花匠] 新人解题报告
- 【NOIP2013花匠】(最长波动序列)
- 【NOIP2013】花匠
- 【noip2013】花匠
- 【NOIP2013】【P1441】花匠