主要有两种做法:
乱搞和dp
dp相对来说考虑的特殊情况少一些
最重要的一点就是:
为了避免类似:(1 2 2 2 1 )的情况,
我们需要一个q记录“前”一个数
p记录当前数
判断时 p > ( < ) q & & p > ( a [ i + 1 ] )即可
1 #include<cstdio> 2 #include<cstring> 3 using namespace std; 4 const int N=100010; 5 int f[N],a[N],n; 6 int read(){ 7 int sum=0; 8 char ch=getchar(); 9 while (ch<'0'||ch>'9') 10 ch=getchar(); 11 while (ch>='0'&&ch<='9'){ 12 sum=sum*10+ch-'0'; 13 ch=getchar(); 14 } 15 return sum; 16 } 17 int main(){ 18 int judge,p,q; 19 n=read(); 20 for (int i=1;i<=n;i++) 21 a[i]=read(); 22 f[1]=1; 23 if (a[2]>a[1]) 24 judge=1; 25 else 26 judge=0; 27 if (a[2]!=a[1]) 28 p=a[2]; 29 else 30 p=a[1]; 31 q=a[1]; 32 for (int i=2;i<n;i++){ 33 if (judge){ 34 f[i]=f[i-1]; 35 if (p>q&&p>a[i+1]) 36 f[i]+=1; 37 if (a[i+1]<p) 38 judge=0; 39 } 40 else{ 41 f[i]=f[i-1]; 42 if (p<q&&p<a[i+1]) 43 f[i]+=1; 44 if (a[i+1]>p) 45 judge=1; 46 } 47 if (a[i+1]!=a[i]){ 48 q=a[i]; 49 p=a[i+1]; 50 } 51 else 52 p=a[i]; 53 54 } 55 f[n]=f[n-1]+1; 56 printf("%d",f[n]); 57 return 0; 58 }