数形结合一波
注:f[i][1]也是这样
法 1 : 珂 学 解 法 法1:珂学解法 法1:珂学解法
#include<bits/stdc++.h>
#define re register
#define f(i, a, b) for(re int i = a; i <= b; i++)
using namespace std;
int n, ans = 1, h[1000001];//建议数据小的题,数组就写main函数外
bool flag;
int main(){
scanf("%d", &n);
f(i, 1, n) scanf("%d", &h[i]);
if(h[2] >= h[1]) flag = true;//原本是不需要等号的,但加了就过了(柯学解法)
f(i, 1, n){
if(!flag && i == n){
++ans;
break;
}
if(flag && h[i + 1] < h[i]){
++ans;
flag = false;
continue;
}
if(!flag && h[i + 1] > h[i]){
++ans;
flag = true;
continue;
}
}
cout << ans;
return 0;
}
法 2 : 正 规 法2:正规 法2:正规dp 大 法 大法 大法
#include<bits/stdc++.h>
#define ll long long
#define re register
#define f(i, a, b) for(re int i = a; i <= b; i++)
using namespace std;
int n;
signed main(){
scanf("%d", &n);
int h[n + 1], f[n + 1][2];
f(i, 1, n) scanf("%d", &h[i]);
f[1][0] = f[1][1] = 1;
f(i, 2, n){
f[i][0] = (h[i] > h[i - 1]) ? f[i - 1][1] + 1 : f[i - 1][0];
f[i][1] = (h[i] < h[i - 1]) ? f[i - 1][0] + 1 : f[i - 1][1];
}
printf("%d\n", max(f[n][0], f[n][1]));
return 0;
}