开始想着
dp
可是发现最好的
dp
都是:
fi,0=max{fj,1+1}(j∈[1,i),hi<hj)
fi,1=max{fj,0+1}(j∈[1,i),hi>hj)
复杂度
O(n2)
有
30%
邪恶的数据过不了。
但是考虑到:
若
fi>fj>fk
或
fi<fj<fk
(i+1=j=k−1)
我们若考虑在
j,k
中选留哪个
显然选
k
,因为
比如数据:
4
4 3 1 2
显然留1
比留3
好。
我们可以看出:
连续上升或下降,只可能留两侧的数。
然后就是:
因为要求最多的盆数,
所以:
每个连续上升或下降的两侧,都要取
所以,直接模拟即可:
int n,ans,g[100010];
bool p;
int main()
{
n=read();
fr(i,1,n)
g[i]=read();
if(g[1]<g[2])
p=1;
ans=1;
fr(i,1,n)
{
if(!p&&i==n)
{
ans++;
break;
}
if((p&&g[i]>g[i+1])||(!p&&g[i]<g[i+1]))
{
ans++;
p^=1;
}
}
printf("%d\n",ans);
rt 0;
}
复杂度: O(n)