一、如何得到升序序列
先定义一个dp数组,每一位代表的是以这一位为结尾升序序列的最长长度。
状态转移方程式max(dp[i],dp[j]+1)这个j代表的是遍历前面的序列,一个一个对比看这个序列跟在哪个序列会最长
代码如下:
for(int i=1;i<=n;i++){
for(int j=1;j<i;j++){
if(h[j]<h[i]){
dp[i]=max(dp[i],dp[j]+1);
}
}
}
二、如何得到降序序列
和升序差不多,直接看代码:
for(int i=n;i>=1;i--){
for(int j=i+1;j<=n;j++){
if(h[j]<h[i]){
right[i]=max(right[i], right[j]+1);
}
}
}
三、例题
完整代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
int ans=1001;
cin>>n;
vector<int> h (n+1);
vector<int> left (n+1,0);
vector<int> right (n+1,0);
for(int i=1;i<=n;i++){
cin>>h[i];
}
for(int i=1;i<=n;i++){
for(int j=1;j<i;j++){
if(h[j]<h[i]){
left[i]=max(left[i],left[j]+1);
}
}
}
for(int i=n;i>=1;i--){
for(int j=i+1;j<=n;j++){
if(h[j]<h[i]){
right[i]=max(right[i], right[j]+1);
}
}
}
for(int i=1;i<=n;i++){
ans=min(ans,n-left[i]-right[i]-1);
}
cout<<ans<<endl;
return 0;
}