$Noip2013/Luogu1970$ 花匠 $dp$+思维
$Sol$
和$Poj1037\ A\ Decorative\ Fence$好像吖.
$f[i][0/1]$表示前$i$个数,且选了第$i$个数,这个数相对于上一个数是下降(上升)的,这样的序列的最大长度.
$f[i][0]=max(f[k][1])+1,k<i且h[k]>h[i]$
$f[i][1]=max(f[k][0])+1,k<i且h[k]>h[i]$
最后答案就是$max_{i=1}^{n}f[i][0/1]$.
然而这样的复杂度是$O(N^2/2)$的,不能$AC$,优化很容易想到能不能去掉内层循环,通过某个变量维护或者是$f[i][0/1]$直接由$f[i-1][0/1]$推出.前者似乎是不可行的,考虑后者.将$f[i][0]$的意思改成前$i$个数选了若干数,最后一个数相对于倒数第二个数是递减的序列的最长长度,$f[i][1]$类似.然而我根本就想不到转移方程于是打开$TJ....ovo$
$if(h[i]>h[i-1])f[i][1]=f[i-1][0]+1;else f[i][1]=f[i-1][1];$
$if(h[i]<h[i-1])f[i][0]=f[i-1][1]+1;else f[i][0]=f[i-1][0];$
最后答案是$f[n][0/1].$
这样理解叭,对于当前序列,假如最后一个数是波谷,那么我们是希望这个数越小越好的,因为后面的波峰更有选择余地.
$upd\ on\ 10.27:$发现我还是不会这题所以又回来看$TJ$,发现不是特别懂上面的$dp$做法,觉得正确性可能还是有点难理解,所以换了一种贪心做法,具体过程写在这里了,点目录里的$2013$可以快速跳转.
$Code$
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
#define il inline
#define Rg register
#define go(i,a,b) for(Rg int i=a;i<=b;++i)
#define yes(i,a,b) for(Rg int i=a;i>=b;--i)
#define mem(a,b) memset(a,b,sizeof(a))
#define ll long long
#define db double
#define inf 2147483647
using namespace std;
il int read()
{
Rg int x=0,y=1;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')y=-1;c=getchar();}
while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+c-'0';c=getchar();}
return x*y;
}
const int N=100010;
int n,h[N];
ll f[N][2];
il ll Max(ll x,ll y){return x>y?x:y;}
int main()
{
n=read();go(i,1,n)h[i]=read();
f[1][0]=f[1][1]=1;
go(i,2,n)
{
if(h[i]>h[i-1])f[i][1]=f[i-1][0]+1;
else f[i][1]=f[i-1][1];
if(h[i]<h[i-1])f[i][0]=f[i-1][1]+1;
else f[i][0]=f[i-1][0];
}
printf("%lld\n",max(f[n][0],f[n][1]));
return 0;
}
随机推荐
- DECLARE
-- 修正用プログラム DECLARE CURSOR c_adv_fee_detail IS SELECT adv_fee.fee_mgmt_num, ...
- Vue6——v-model实现数据双向绑定
博客地址 :https://www.cnblogs.com/sandraryan/ v-model 用于input标签,用于实现双向绑定,及时把数据的变化渲染在页面 双向绑定及原理 举个双向绑定的简单 ...
- 【BestCoder Round #93 1002】MG loves apple
[题目链接]:http://acm.hdu.edu.cn/showproblem.php?pid=6020 [题意] 给你一个长度为n的数字,然后让你删掉k个数字,问你有没有删数方案使得剩下的N-K个 ...
- ifram子页面与父页面的方法相互调用
parent.html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http:/ ...
- mac上的mysql管理工具sequel pro
https://blog.csdn.net/wan_zaiyunduan/article/details/54909389 以前用过Plsql.Navicat.Workbench,现在换到mac上,用 ...
- 如何查看linux中的ssh端口开启状态
netstat -anp |grep 22 netstat -anp |grep sshlsof -i :22
- 《Spring 5官方文档》 Spring AOP的经典用法
原文链接 在本附录中,我们会讨论一些初级的Spring AOP接口,以及在Spring 1.2应用中所使用的AOP支持. 对于新的应用,我们推荐使用 Spring AOP 2.0来支持,在AOP章节有 ...
- html input onfocus
<input type="text" value="请输入内容" onfocus="javascript:if(this.value=='请输入 ...
- 性能测试基础-开门篇3(LR常用函数介绍)
LR常用的函数,协议不一样函数会不一样,这里简单的介绍下HTTP\WEBSERVICE\SOCKET协议常用函数: HTTP: web_set_max_html_param_len("102 ...
- Vue中的computed和watch
看了网上很多资料,对vue的computed讲解自己看的都不是很清晰,今天忙里抽闲,和同事们又闲聊起来,对computed这个属性才有了一个稍微比较清晰的认识,下面的文章有一部分是转自: https: ...