【算法】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. 【Linux】CentOS安装redis

    CENTOS7下安装REDIS 安装完成之后使用:redis-cli命令连接,如图: 提示:/var/run/redis_6379.pid exists, process is already run ...

  3. Windows资源监控工具大全

    在利用LoadRunner进行性能测试的时候,Windows服务器的资源是经常需要监控的对象.其实除了LoadRunner提供的计数器,似乎Window服务器并不像Unix或者Linux提供众多的性能 ...

  4. Agile.Net 组件式开发平台 - 驱动开发示例

    首先讲一下概念,此驱动非彼驱动.在Agle.Net中我们将组件规划成两种类型,一种是基于业务的窗体组件,一种是提供扩展功能的驱动组件. 打个比方例如一般系统中需要提供身份证读卡功能,然而市面上有很多种 ...

  5. == 和equal的区别?-005

    1,== 和equal的区别? ==比较两个值是否相等,equal比较对对象的引用是否一致 举例: int a = 2; int b = 2; System.err.println(a == b);/ ...

  6. 第26天:js-$id函数、焦点事件

    一.函数return语句定义函数的返回值,在函数内部用return来设置返回值,一个函数只能有一个返回值.同时,终止代码的执行.所有自定义函数默认没有返回值return后面不要换行 var a=10, ...

  7. C++除法运算 // 静态断言

    1.C++中"/"运算:对两个整数做除法,结果仍为整数,如果它的商包含小数部分,则小树部分会被截除. C++ Primer 第五章 P130 2.静态断言(static_asser ...

  8. 第三方框架-纯代码布局:Masonry的简单使用

    Masonry是一个对系统NSLayoutConstraint进行封装的第三方自动布局框架,采用链式编程的方式提供给开发者API.系统AutoLayout支持的操作,Masonry都支持,相比系统AP ...

  9. bzoj 4568 [SCOI 2016] 幸运数字

    题目大意 给定一棵\(n\)个点的树,每个点有权值 \(q\)次询问树上路径中 每个点权值可选可不选的最大异或和 \(n\le 2*10^4,q\le 2*10^5,val[i]\le 2^{60}\ ...

  10. BZOJ3167/BZOJ4824 HEOI2013SAO/CQOI2017老C的键盘(树形dp)

    前者是后者各方面的强化版. 容易想到设f[i][j]表示i子树中第j小的是i的方案数(即只考虑相对关系).比较麻烦的在于转移.考虑逐个合并子树.容易想到枚举根原来的排名和子树根原来的排名,算一发组合数 ...