先从前往后扫,再从后往前扫。
#include <iostream>
#include <cstring>
#include <math.h>
using namespace std;
const int N = 1001;
int height[N];
int dp[N];
int dp2[N];
int main(){
int n;
while(cin >> n){
int maxh = 0;
for(int i = 0; i < n; i++){
cin >> height[i];
}
//int ans1 = 0;
for(int i = 0; i < n; i++){
dp[i] = 1; //初始化
for(int j = 0; j < i; j++){
if(height[i] > height[j]){
dp[i] = max(dp[i], dp[j] + 1);
}
}
}
// for(int i = 0; i < n; i++){
// dp2[i] = 1; //初始化
// for(int j = 0; j < i; j++){
// if(height[i] < height[j]){
// dp2[i] = max(dp2[i], dp2[j] + 1);
// }
// }
// }
int ans = 0;
for(int i = n - 1; i >= 0; i--){
dp2[i] = 1;
for(int j = n - 1; j > i; j--){
if(height[j] < height[i]){
dp2[i] = max(dp2[i], dp2[j] + 1);
}
}
ans = max(ans, dp[i] + dp2[i] - 1);
}
// int ans = 0;
// for(int i = 0; i < n; i++){
// ans = max(ans, dp[i] + dp2[i] - 1);
// }
printf("%d\n", n - ans);
}
return 0;
}被注释的部分是我的想法,只是单纯找到最长升序或者降序,而不是求一个数前边的最长升序和后边的最长降序。

京公网安备 11010502036488号