题目地址

https://www.luogu.org/problemnew/show/P1970

题目描述

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

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

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

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

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

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

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

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

输入输出格式

输入格式:

输入文件为 flower .in。

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

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

输出格式:

输出文件为 flower .out。

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

输入输出样例

输入样例#1:

5
5 3 2 1 2
输出样例#1:

3

思路

看到这个题,很容易联想到最长上升子序列,但是要想找出其中的联系,又似乎没有那么容易,其实我们模拟一下就可以知道大概地思路了

5 3 4 2 4 6 2 1 4

例如上面这个样例,按照题意,必须按照一上一下排列,那么就有先上和现下两种情况,我们不妨分开讨论(其实思路是一样的)。

    我们以先找向下的数为例, 我们先将5放入一个数组f,表示5要保留,然后我们要找一个更小的数,恰好3比5小,所以将3也放入数组,继续

我们就要找一个更大的数,恰好4比3大,放入,然后更小得数,2放入,然后更大,4放入(好巧..),然后我们要找更小的数,但是

6比4大,然后我们考虑,以一个更大的数为标准找跟小的数,可以找到的更多数,所以我们用6更新掉4,也就是将4移走(这就是与最

长上升子序列相似的地方)。当然,如果找到的数与当前的数一样,那么久按照第二种方法处理。

   然后我们按照同样的方法找一遍现找向上的数,取两个长度中的大的一个。最后就是答案了(似乎比最长上升子序列更简单......)、

  具体代码实现的话,我的思路是可以找一个变量记录方向,然后每次找到新点之后,将方向改变(所谓方向,其实就是下一个点要更大还是更小),用一个数组f

来存放进去的数(既留下的数),并用一个变量len来记录它的长度,最后输出长度就好了。

代码

 #include<cstdio>
#include<iostream>
using namespace std;
int n,a[],f[];
bool fx=;//0时找更小的,1时找更大的
int main()
{
scanf("%d",&n);
for(int i=;i<=n;++i)
{
scanf("%d",&a[i]);//用a来存花的高度
}
int len1=;//len用来记录留下花的个数
f[++len1]=a[];//先将第一个放入
fx=;//先寻找更小的
for(int i=;i<=n;++i)
{
if(fx==)
{
if(a[i]<f[len1])//符合要求就放入
{
f[++len1]=a[i];
fx=;//改变方向
}
else//不符合要求就更新当前点(不用改变方向)
f[len1]=a[i];
}
if(fx==)//同样方法判断向上找的情况
{
if(a[i]>f[len1])
{
f[++len1]=a[i];
fx=;
}
else
f[len1]=a[i];
}
}
memset(f,,sizeof(f));
int len2=;//与上方雷同,只不过实现找更大的
f[++len2]=a[];
fx=;
for(int i=;i<=n;++i)
{
if(fx==)
{
if(f[len2]>a[i])
{
f[++len2]=a[i];
fx=;
}
else
f[len2]=a[i];
}
if(fx==)
{
if(f[len2]<a[i])
{
f[++len2]=a[i];
fx=;
}
else
f[len2]=a[i];
}
}
printf("%d",max(len1,len2));//输出两种情况中更大的一种情况
return ;
}

[luogu1970][花匠]的更多相关文章

  1. luogu1970 花匠(dp)

    设f1[i]表示以1..i中某个合法序列的长度,而且最后一位是较大的 f2[i]表示以1..i中某个合法序列的长度,而且最后一位是较小的 那么就有$f1[i]=max\{f2[j]+1\},(j< ...

  2. $Noip2013/Luogu1970$ 花匠 $dp$+思维

    $Luogu$ $Sol$ 和$Poj1037\ A\ Decorative\ Fence$好像吖. $f[i][0/1]$表示前$i$个数,且选了第$i$个数,这个数相对于上一个数是下降(上升)的, ...

  3. codevs 3289 花匠

    题目:codevs 3289 花匠 链接:http://codevs.cn/problem/3289/ 这道题有点像最长上升序列,但这里不是上升,是最长"波浪"子序列.用动态规划可 ...

  4. NOIP2013花匠

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

  5. NOIP2013 花匠

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

  6. [NOIP2013] 提高组 洛谷P1970 花匠

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

  7. NOIp 2013 #2 花匠 Label:爆0的Water

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

  8. NOIP2013 提高组day2 2 花匠 动规 找拐点 树状数组

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

  9. 【NOIP2013】【P1441】花匠

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

随机推荐

  1. Day 3-4 函数进阶

    1.名称空间 定义:Python使用叫做命名空间的东西来记录变量的轨迹.命名空间是一个 字典(dictionary) ,它的键就是变量名,它的值就是那些变量的值.是存放变量和值的内存地址的绑定关系的空 ...

  2. Java 线程的创建和启动

    Java 使用 Thread 类代表线程,所有的线程对象都必须是 Thread 类或其子类的实例.每个线程的作用是完成一定的任务,实际上就是执行一段程序流(一段顺序执行的代码). Java 使用线程执 ...

  3. zabbix自定义监控项

    原因:zabbix监控系统自带的监控规则有限,如果需要更加灵活的定义监控项,可以通过修改配置文件实现 vim xxx/zabbix_agentd.conf UnsafeUserParameters=1 ...

  4. mobile adaptor & css media query

    mobile adaptor & css media query 移动端适配 & 媒体查询 http://cssmediaqueries.com/ device-aspect-rati ...

  5. Java的hashCode和equals方法

    当然健壮的代码,两个都重写那是最好. 用不到hashCode的, 也没有必要重写hashCode. 个人感觉. 哈希机制的Java集合类,例如 Hashtable, HashMap, HashSet ...

  6. 在文件保存中 os.getcwd() os.listdir() os.makedirs() os.mkdir() xx.join() ... 等函数 的使用介绍

    path = 'C:\\Users\\zhangjunming\\Desktop\\PycharmProjects\\my_mgm' 1.xx.join(obj)   以xx为分隔符 对obj中的元素 ...

  7. Java之XML操作:从XML中直接获取数据

    本文介绍如何将数据记录在XML文件中,然后通过DOM4J直接从XML中读取到数据. 依赖包: <dependency> <groupId>dom4j</groupId&g ...

  8. Ubuntu18.04安装RabbitMQ

    Ubuntu18.04安装RabbitMQ 2018年06月10日 19:32:38 dmfrm 阅读数:2492    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog ...

  9. Qt 获取屏幕信息

    void GetScreenInfo() { QDesktopWidget* desktopWidget = QApplication::desktop(); //获取可用桌面大小 QRect des ...

  10. Java虚拟机构建对象过程小记

    Java对象的内存分布 Java对象的构建 Java程序中,新建对象,除了常见的new语句之外,还可以通过反射机制.Object.clone方法.反序列化以及Unsafe.allocateInstan ...