$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;
}
随机推荐
- 浅析调用android的content provider(一)
在Android下,查询联系人.通话记录等,需要用到content provider.但是,调用content provider时,Android框架内部是如何做的呢?这一系列文章就是 ...
- 2018-3-22-win10-uwp-设置-HttpClient-浏览器标识
title author date CreateTime categories win10 uwp 设置 HttpClient 浏览器标识 lindexi 2018-3-22 9:1:55 +0800 ...
- @bzoj - 4524@ [Cqoi2016]伪光滑数
目录 @description@ @solution@ @version - 1@ @version - 2@ @accepted code@ @version - 1@ @version - 2@ ...
- gSOAP calc服务端与客户端示例
1. Web服务定义描述头文件 typedef double xsd__double; int ns__add(xsd__double a, xsd__double b, xsd__double &a ...
- eclipse本地启动tomcat报错集锦
1.eclipse本地添加tomcat服务器 打开Eclipse,单击“window”菜单,选择下方的“Preferences”: 找到Server下方的Runtime Environment, ...
- 高并发下载tomcat下的文件时,发生java.net.SocketException: Connection reset解决方案
(1)问题产生:使用500个线程并发下载tomcat工程中的一个文件时,服务器出现java.net.SocketException: Connection reset异常, 客户端出现connect ...
- 如何读取redis中的key值中的结果
redis的值有5种类型,不同的类型有不同的命令来获取: 字符直接 get key 队列 左端弹出一个元素 LPOP key 哈希 HGET key field 集合 SMEMBERS key 返回 ...
- H3C RIP基本配置
- SELECT command denied to user 'username'@'ip' for table 'user'错误处理
错误信息 使用RDS for MySQL,程序执行查询SQL时报错如下: SELECT command denied to user 'username'@'ip' for table 'user' ...
- 2018-8-10-win10-uwp-获取文件夹出错
title author date CreateTime categories win10 uwp 获取文件夹出错 lindexi 2018-08-10 19:16:50 +0800 2018-2-1 ...