状态定义是dp中非常重要的,可以直接影响到效率,如此题,第一种思路是:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 100005;
struct node {
int high, value;
bool operator < (const node &i) const{
return (this->value < i.value);
}
};
int main() {
int n;
scanf("%d", &n);
int fl[maxn];
for(int i = 1; i <= n; i++) scanf("%d", &fl[i]);
int f[maxn], g[maxn];
priority_queue<node> pf, pg;
f[1] = 1; g[1] = 1;
pf.push({fl[1], f[1]}); pg.push({fl[1], g[1]});
for(int i = 2; i <= n; i++) {
node x = pf.top();
node y = pg.top();
pf.pop(); pg.pop();
int cnt = 0;
while(x.high <= fl[i] && cnt < pf.size()) {
node e = pf.top(); pf.pop();
pf.push(x); x = e; cnt++;
}
cnt = 0;
while(y.high >= fl[i] && cnt < pg.size()) {
node e = pg.top(); pg.pop();
pg.push(y); y = e;cnt++;
}
f[i] = 1; g[i] = 1;
if(x.high > fl[i]) g[i] = x.value + 1;
if(y.high < fl[i]) f[i] = y.value + 1;
pf.push({fl[i], f[i]});
pg.push({fl[i], g[i]});
pf.push(x);
pg.push(y);
}
int ans = 0;
for(int i = 1; i <= n; i++) {
ans = max(ans, f[i]);
ans = max(ans, g[i]);
}
cout << ans;
}

定义f[i]为以i结束,加上优先队列优化,很麻烦,也容易被卡掉,复杂度不稳定,从O(nlogn)~O(n2)

#include <bits/stdc++.h>
using namespace std;
const int maxn = 100005;
int main() {
int n;
scanf("%d", &n);
int fl[maxn];
for(int i = 1; i <= n; i++) scanf("%d", &fl[i]);
int f[maxn], g[maxn];
f[1] = 1; g[1] = 1;
for(int i = 2; i <= n; i++) {
if(fl[i] > fl[i-1]) {
f[i] = max(f[i-1], g[i - 1]+1);
g[i] = g[i-1];
}
else if(fl[i] < fl[i-1]) {
f[i] = f[i-1];
g[i] = max(g[i-1], f[i-1] + 1);
}
else {
f[i] = f[i-1];
g[i] = g[i-1];
}
}
cout << max(f[n], g[n]);
}

定义f[i]为前i个数,不需要优化,效率高,复杂度降低到了O(n)!

算法真神奇。

P1970 花匠的更多相关文章

  1. Luogu P1970 花匠

    Luogu P1970 花匠 本质上就是找最长的波浪序列. 因为考虑到第一个必选,所以可以让$lst=h[1]$. 此外,注意到$n=1$是要特判,其他情况下显然$ans\geq 2$,所以把$dir ...

  2. DP练习题——洛谷P1970花匠

    目录 题目描述: 输入输出格式: 输入格式: 输出格式: 输入输出样例: 输入样例: 输出样例: 题目分析: 解法一: 解法二: 结语: 题目描述: 洛谷\(P1970\) 花匠栋栋种了一排花,每株花 ...

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

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

  4. Luogu P1970 花匠 【线性Dp】 By cellur925

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

  5. 洛谷 P1970 花匠 —— DP

    题目:https://www.luogu.org/problemnew/show/P1970 普通的DP,f[i][0/1] 表示 i 处处于较小或较大的长度: 注意:1.树状数组向后 query 时 ...

  6. 洛谷——P1970 花匠

    https://www.luogu.org/problem/show?pid=1970 题目描述 花匠栋栋种了一排花,每株花都有自己的高度.花儿越长越大,也越来越挤.栋栋决定 把这排中的一部分花移走, ...

  7. 洛谷 P1970 花匠

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

  8. 洛谷P1970 花匠

    传送门 首先可以知道,如果一个序列是连续上升的,那么只需要取这一个序列中最高的元素即可,因为取其它的不能保证大于后面的.连续下降的序列同理.而这些恰好就是波峰和波谷. 所以遇到 $ j $ 比之前的 ...

  9. 洛谷P1970 花匠(dp)

    题意 题目链接 Sol 直接用\(f[i][0/1]\)表示到第\(i\)个位置,该位置是以上升结尾还是以下降结尾 转移的时候只需枚举前一个即可 #include<cstdio> #inc ...

随机推荐

  1. node.js简单的页面输出

    在node.js基本上没有兼容问题(如果你不是从早期的node.js玩起来),而且原生对象又加了这么多扩展,再加上node.js自带的库,每个模块都提供了花样繁多的API,如果还嫌不够,github上 ...

  2. 关于MFC监听器的相关了解

    最近有个项目,所搭框架为了减少耦合,希望MainFrame中View不依赖于Mainframe,即MainFrame中含有view类而view中不会包含MainFrame的相关信息. 现在遇到一个问题 ...

  3. Android 颜色Color(转)

    摘自:http://blog.sina.com.cn/s/blog_6f3ff2c90100t2oa.html Android中使用4个数字来表示颜色,分别是alpha.红(red).绿(green) ...

  4. Codeforces Round #313 (Div. 2) C. Gerald's Hexagon 数学

    C. Gerald's Hexagon Time Limit: 2 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/559/pr ...

  5. CC2540开发板学习笔记(七)—— 睡眠唤醒

    (一)中断唤醒 一.实验内容 通过中断唤醒在睡眠模式下的CC2540 二.实验原理 1.系统电源管理(工作方式) (1)全功能模式: 高频晶振(16M或者32M)和低频晶振(32.768K RCOSC ...

  6. Messenger信使

    * Messenger用于Activity和Service之间消息传递 需求:activity来绑定服务,绑定成功后,将数据发送给service,service收到消息后,再发送信息给activity ...

  7. aggregateByKey

    def seq(a:Int, b:Int) : Int ={ math.max(a,b) } def comb(a:Int, b:Int) : Int ={ a + b } val data = sc ...

  8. web service介绍

    WEB SEVICE平台 web Service 三种基本元素: SOAP .WSDL .UDDI 什么是SOAP:       XML+HTTP 基本的Web Service平台 SOAP 简易对象 ...

  9. VMware12版虚拟机怎么安装win7系统

    工具/原料   VMware workstation 12 windows7镜像ios系统文件 链接:http://pan.baidu.com/s/1c0YrDgG 密码:vna1 建立一个新的虚拟机 ...

  10. LightOJ1013 Love Calculator(DP)

    容易猜测到包含s1.s2序列的串的最短长度是LCS(s1,s2) + ( len(s1) - LCS(s1,s2) ) + ( len(s2) - LCS(s1,s2) ) ,即: len(s1)+l ...