【算法】贪心
【题解】
DP可以f[i][0],f[i][1]表示选了i分别满足条件AB的答案,其优化也是利用了下面的性质,不多赘述。
想象数列的波动,最大值一定是取每个波峰和每个波谷,那么只要O(n)统计就可以了。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<cstdio> #include<cstring> #include<cctype> #include<cmath> #include<algorithm> #define ll long long using namespace std; int read() { char c;int s=0,t=1; while(!isdigit(c=getchar()))if(c=='-')t=-1; do{s=s*10+c-'0';}while(isdigit(c=getchar())); return s*t; } /*------------------------------------------------------------*/ const int inf=0x3f3f3f3f,maxn=100010; int n,a[maxn]; int main() { scanf("%d",&n); for(int i=1;i<=n;i++)scanf("%d",&a[i]); bool ok=0,flag=0; for(int i=2;i<=n;i++) { if(a[i]>a[i-1]){flag=0;ok=1;break;} if(a[i]<a[i-1]){flag=1;ok=1;break;} } if(!ok){printf("1");return 0;} int ans=0; for(int i=2;i<=n;i++) { if(flag) { if(a[i]<a[i-1]) { flag=0; ans++; } } else { if(a[i]>a[i-1]) { flag=1; ans++; } } } printf("%d",ans+1); return 0; }