【算法】DP||贪心

【题解】

(1)动态规划:

令f[i][0..1]为两种条件下前i株花的最大保留数量,状态转移方程:

f[i][0]=max(f[j][1]+1) (j=i-1...1)(h[i]>h[j])

f[i][1]=max(f[j][0]+1) (j=i-1...1)(h[i]<h[j])

初始化:f[i][0]=f[i][1]=1,这样时间复杂度是O(n^2)。

由于题目的数据范围中有一句话:所有的h_i随机生成,所有随机数服从某区间内的均匀分布。

所以加个优化,因为f[i][0](i=1...n)和f[i][1](i=1...n)存在单调性(不下降),即f[x][0]>=f[y][0](x>y),f[x][1]>=f[y][1](x>y)

所以在状态转移枚举j时,当f[i][0]和f[i][1]都>1(大于初始值)时,就可以不用再向前找j而是直接跳向下一个i。

优化后可以通过所有数据(AC)。

#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=;
int f[maxn][],h[maxn],n;
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
{
scanf("%d",&h[i]);
f[i][]=;f[i][]=;
}
for(int i=;i<=n;i++)
for(int j=i-;j>=;j--)
{
if(h[i]>h[j])f[i][]=max(f[i][],f[j][]+);
if(h[i]<h[j])f[i][]=max(f[i][],f[j][]+);
if(f[i][]>&&f[i][]>)break;//剪枝优化,单调性
}
printf("%d",max(f[n][],f[n][]));
return ;
}

(2)贪心

学自:http://tieba.baidu.com/p/2714238975

先把序列中相邻的相同元素删剩一个(去重),然后在序列中寻找所有满足a[i-1]<a[i]>a[i+1]或者a[i-1]>a[i]<a[i+1]的元素,这样的元素个数即答案。

解释:去重后的序列就是在不断波动,因此这两种元素一定会交替出现,而相邻的这两种元素中间的一段,这一段必然是单调递增或者单调递减的,因此最多选择两个元素,而选择两个端点就必然是最优的。

这样时间复杂度是O(n)。

#include<cstdio>
int a[],b[],n,ans,tot;
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)scanf("%d",&a[i]);
b[(tot=)]=a[];
for(int i=;i<=n;i++)
if(a[i]!=b[tot])b[++tot]=a[i];
ans=;//1和n
for(int i=;i<tot;i++)
if((b[i]<b[i-]&&b[i]<b[i+])||(b[i]>b[i-]&&b[i]>b[i+]))ans++;
if(tot==)ans=;if(tot==)ans=;
printf("%d",ans);
return ;
}

【NOIP】2013提高组 花匠(摆花)的更多相关文章

  1. noip 2013 提高组 Day2 部分题解

    积木大赛: 之前没有仔细地想,然后就直接暴力一点(骗点分),去扫每一高度,连到一起的个数,于是2组超时 先把暴力程序贴上来(可以当对拍机) #include<iostream> #incl ...

  2. NOIP 2013 提高组 day1 T2 火柴排队 归并 逆序对

    描述 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度.现在将每盒中的火柴各自排成一列,同一列火柴的高度互不相同,两列火柴之间的距离定义为:∑i=1n(ai−bi)2∑i=1n(ai−bi) ...

  3. NOIP 2013提高组day 1 T 1转圈游戏 快速幂

    描述 n 个小伙伴(编号从 0 到 n-1)围坐一圈玩游戏.按照顺时针方向给 n 个位置编号,从0 到 n-1.最初,第 0 号小伙伴在第 0 号位置,第 1 号小伙伴在第 1 号位置,……,依此类推 ...

  4. NOIP 2013 提高组 day2 积木大赛

      积木大赛 描述 春春幼儿园举办了一年一度的“积木大赛”.今年比赛的内容是搭建一座宽度为 n 的大厦,大厦可以看成由 n 块宽度为1的积木组成,第

  5. noip 2013 提高组 day1

    1.转圈游戏: 解析部分略,快速幂就可以过 Code: #include<iostream> #include<fstream> using namespace std; if ...

  6. NOIP 2013 提高组 洛谷P1967 货车运输 (Kruskal重构树)

    题目: A 国有 nn 座城市,编号从 11 到 nn,城市之间有 mm 条双向道路.每一条道路对车辆都有重量限制,简称限重. 现在有 qq 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情 ...

  7. NOIP 2008提高组第三题题解by rLq

    啊啊啊啊啊啊今天已经星期三了吗 那么,来一波题解吧 本题地址http://www.luogu.org/problem/show?pid=1006 传纸条 题目描述 小渊和小轩是好朋友也是同班同学,他们 ...

  8. [NOIp 1998 提高组]Probelm 2 连接多位数【2011百度实习生笔试题】

    /*====================================================================== [NOIp 1998 提高组]Probelm 2 连接 ...

  9. NOIP 2014 提高组 题解

    NOIP 2014 提高组 题解 No 1. 生活大爆炸版石头剪刀布 http://www.luogu.org/problem/show?pid=1328 这是道大水题,我都在想怎么会有人错了,没算法 ...

随机推荐

  1. UVALive - 6856 Circle of digits 后缀数组+二分

    题目链接: http://acm.hust.edu.cn/vjudge/problem/82135 Circle of digits Time Limit: 3000MS 题意 把循环串分割成k块,让 ...

  2. 深入理解Java之数据类型

    一.概述 我们通过编程解决一个具体问题时,首先要做的工作是用各种“数据结构”表示问题中的实体对象,而后才能着手研究描述具体业务逻辑的算法.这也正印证了”程序 = 数据结构 + 算法“.而这里的数据结构 ...

  3. iOS- 简单说说iOS移动客户端SQLite3的基本使用

    1.为什么要使用SQLite3? •大量数据需要存储 •管理数据,存储数据   SQLite是一种关系型数据库(也是目前移动客户端的主流数据库)     2.SQLite3的几种存储类型   a.NU ...

  4. winform Form窗体和UserControl用户空间嵌入Panel容器并填充

    private void sbtbflList_Click(object sender, EventArgs e) { ucxmflList ucfl = new ucxmflList();//用户控 ...

  5. New API

    New API Producer >增加发送回调 >重构Partition 统一High Level API与Low Level API >从kafka.consumer和kafka ...

  6. Hadoop Yarn-入门篇

    参考并推荐博文:https://www.ibm.com/developerworks/cn/opensource/os-cn-hadoop-yarn/ 重构根本的思想是将 JobTracker 两个主 ...

  7. Spring.NET中事务管理【转】

    http://www.cnblogs.com/GoodHelper/archive/2009/11/16/springnet_transaction.html 浏览了下写的比较清楚. 在.NET FC ...

  8. nodejs创建多层目录

    1. fs.mkdir不能一次创建多层目录,必须先创建上层目录,再创建下层目录 //同步 fs.mkdirSync("./tmp/"); fs.mkdirSync("./ ...

  9. SQL_MODE

    一 声明 标红部分为重点了解 原文:https://segmentfault.com/a/1190000005936172 二 SQL_MODE参数值 官方手册专门有一节介绍 https://dev. ...

  10. 解决webstrom 输入法光标不跟随问题

    参考博客地址 https://blog.csdn.net/wang414300980/article/details/79537875 原因是jdk版本问题,下载jdk jbsdk8u152b1036 ...