将序列分成最少的段,每段都是非递减,或者非递增的。
dp: dp[i][0] 表示到i点是非递增的划分数
dp[i][1] 表示到i点是非递减的划分数
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<set>
#include<queue>
#include<map>
using namespace std;
#define FOR(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)
#define DOR(i,a,b) for(int (i)=(a);(i)>=(b);(i)--)
#define bug puts("Fuck");
#define LL long long
#define pb push_back
#define mp make_pair
#define nMax 101000
#define eps 1e-8
#define inf 0x7fffffff
int s[nMax];
int dp[nMax][2];
int a,b,n;
void sovle(){
dp[0][0]=dp[0][1]=1;
FOR(i,1,n) {
if(s[i-1] > s[i]) {
dp[i][0] = min(dp[i-1][0],dp[i-1][1]+1);
dp[i][1] = min(dp[i-1][0],dp[i-1][1]) + 1;
}else if(s[i-1] < s[i]) {
dp[i][0] = min(dp[i-1][0],dp[i-1][1]) + 1;
dp[i][1] = min(dp[i-1][0]+1,dp[i-1][1]);
}else {
dp[i][0] = min(dp[i-1][0],dp[i-1][1]+1) ;
dp[i][1] = min(dp[i-1][0]+1,dp[i-1][1]);
}
//printf("%d - %d %d\n",i,dp[i][0],dp[i][1]);
}
int ans = min(dp[n][0],dp[n][1]);
printf("%d\n",ans);
}
int main(){
#ifndef ONLINE_JUDGE
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
#endif
while(~scanf("%d%d",&a,&b)){
FOR(i,0,b-a)scanf("%d",&s[i]);
n=b-a;
sovle();
}
return 0;
}