#include<cstdio> const int N=50005,inf=1000000000; int n,i,j,k,o,x,y,w,ans,a[N],f[N][3]; inline void up(int&a,int b){a<b?(a=b):0;} inline int get(int x,int y){ if(y==1)return -inf; if(y==2)return inf; return a[x]; } int main(){ scanf("%d",&n); for(i=1;i<=n;i++)scanf("%d",&a[i]); for(i=0;i<2;i++){ for(j=1;j<=n;j++)a[j]*=-1; for(j=1;j<=n;j++)for(k=0;k<3;k++)f[j][k]=-1; for(k=0;k<3;k++)f[1][k]=k==0; for(j=1;j<n;j++)for(k=0;k<3;k++){ w=f[j][k]; if(w<0)continue; x=get(j,k); for(o=0;o<3;o++){ y=get(j+1,o); if(j&1){ if(x<=y)continue; }else{ if(x>=y)continue; } up(f[j+1][o],w+(o==0)); } } for(k=0;k<3;k++)up(ans,f[n][k]); } printf("%d",n-ans); }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | #include<cstdio> const int N=50005,inf=1000000000; int n,i,j,k,o,x,y,w,ans,a[N],f[N][3]; inline void up(int&a,int b){a<b?(a=b):0;} inline int get(int x,int y){ if(y==1)return -inf; if(y==2)return inf; return a[x]; } int main(){ scanf("%d",&n); for(i=1;i<=n;i++)scanf("%d",&a[i]); for(i=0;i<2;i++){ for(j=1;j<=n;j++)a[j]*=-1; for(j=1;j<=n;j++)for(k=0;k<3;k++)f[j][k]=-1; for(k=0;k<3;k++)f[1][k]=k==0; for(j=1;j<n;j++)for(k=0;k<3;k++){ w=f[j][k]; if(w<0)continue; x=get(j,k); for(o=0;o<3;o++){ y=get(j+1,o); if(j&1){ if(x<=y)continue; }else{ if(x>=y)continue; } up(f[j+1][o],w+(o==0)); } } for(k=0;k<3;k++)up(ans,f[n][k]); } printf("%d",n-ans); } |