$Luogu$

$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;
}

随机推荐

  1. vlc 网页插件的 使用与控制 API

    下面开始使用教程: html文档结构: <object class="vlc" type='application/x-vlc-plugin' events='True' w ...

  2. vue filter使用方法

    Vue.js 允许你自定义过滤器,可被用于一些常见的文本格式化. 过滤器可以用在两个地方:双花括号插值和 v-bind 表达式 (后者从 2.1.0+ 开始支持). 过滤器应该被添加在 JavaScr ...

  3. iptables 网址转译 (Network Address Translation,NAT)

    当封包流经NAT電腦時,其位址/通訊端口會被修改,以達到改变包目的地(或旅程),或是让目的地误以为包是源自NAT电脑的效果.換言之,对封包执行NAT的电脑,可以成为新包的来源或目的地,或是成为真正来源 ...

  4. 为更强大而生的开源关系型数据库来了!阿里云RDS for MySQL 8.0 正式上线!

    2019年5月29日15时,阿里云RDS for MySQL 8.0正式上线,使得阿里云成为紧跟社区步伐,发布MySQL最新版本的云厂商.RDS for MySQL 8.0 产品是阿里云推出的 MyS ...

  5. poj 1436 && zoj 1391 Horizontally Visible Segments (Segment Tree)

    ZOJ :: Problems :: Show Problem 1436 -- Horizontally Visible Segments 用线段树记录表面能被看见的线段的编号,然后覆盖的时候同时把能 ...

  6. centos 磁盘挂载

    1.更改磁盘格式 fdisk -l fdisk /dev/vdb mkfs.xfs /dev/vdb1 mkfs.xfs /dev/vdb1 -f 2.查看UUID blkid 3.挂载文件夹 vim ...

  7. SuperSocket 扩展你的 Logger

    SuperSocket 允许你自定义你的 Logger. 例如,你如果想要把你的业务操作日志保存到一个独立的地方,你仅需要在log4net配置文件中添加一个新的 logger 并为这个 logger ...

  8. iOS设备 微信h5页面回退 内容不刷新的问题

    原因分析: 一.android 浏览器 包括微信的开发者工具 都是ok的返回可以刷新页面但是唯有iOS不行. 二.iOS 浏览器原因:history.go(-1)返回上一页后,页面内容并不会刷新.在B ...

  9. h5的canvas绘制方格(边框随即色)

    文章地址 https://www.cnblogs.com/sandraryan/ 两个循环绘制 <body> <canvas id="cv" width=&quo ...

  10. jq杂项方法/工具方法----isArray()

    https://www.cnblogs.com/sandraryan/ $.isArray()函数用于判断指定参数是否是一个数组.返回布尔值. <!DOCTYPE html> <ht ...