解题思路
设lx[i]表示以i为结尾的最长不下降序列的起点,ly[i]表示以i为结尾的最长不上升序列的起点,然后dp[i]表示到i为止最少要分多少段,每次更新完
l
x
[
i
]
,
l
y
[
i
]
lx[i],ly[i]
lx[i],ly[i]后更新
‘
在
这
里
插
入
代
码
片
‘
d
p
[
i
]
`在这里插入代码片`dp[i]
‘在这里插入代码片‘dp[i]
d
p
[
i
]
=
m
i
n
(
d
p
[
l
x
[
i
]
]
+
1
,
d
p
[
l
y
[
i
]
]
+
1
)
;
dp[i]=min(dp[lx[i]]+1,dp[ly[i]]+1);
dp[i]=min(dp[lx[i]]+1,dp[ly[i]]+1);
代码
#include<bits/stdc++.h>
using namespace std;
int n,a[100010],lx[100010],dp[100010],ly[100010];
int main() {
scanf("%d",&n);
for(int i=1; i<=n; i++)
scanf("%d",&a[i]);
memset(dp,0x3f3f3f3f,sizeof(dp));
lx[1]=0,ly[1]=0,dp[0]=0,dp[1]=1;
for(int i=2; i<=n; i++) {
lx[i]=i-1,ly[i]=i-1;
if(a[i]>=a[i-1])
lx[i]=lx[i-1];
if(a[i]<=a[i-1])
ly[i]=ly[i-1];
dp[i]=min(dp[lx[i]]+1,dp[ly[i]]+1);
}
printf("%d\n",dp[n]);
}