题目描述
知识点
正反两次LIS,套了一层壳的LIS
实现
码前思考
- 感觉这道题目会更加能够体现LIS中的
dp
数组的含义(之前的LIS题目都要自己去想一个LIS一定是dp
数组里面最大的那个,因此使用dp
数组)
代码实现
//这道题目更加能够体现LIS中dp数组的涵义!!!
//dp数组的涵义:以i结尾的字串的最长上升序列!!!一定要以i结尾
#include "bits/stdc++.h"
using namespace std;
const int maxn = 110;
//输入的同学的数量
int n;
//身高数组
int h[maxn];
//正向dp数组
int dpi[maxn];
//逆向dp数组
int dpd[maxn];
int main(){
while(~(scanf("%d",&n))){
int input;
for(int i=1;i<=n;i++){
scanf("%d",&h[i]);
}
//正反两次的LIS
//正的
dpi[1] = 1;
for(int i=2;i<=n;i++){
dpi[i] = 1;
for(int j=1;j<i;j++){
if(h[i] > h[j]){
dpi[i] = max(dpi[i],dpi[j]+1);
}
}
}
dpd[n] = 1;
for(int i=n-1;i>=1;i--){
dpd[i] = 1;
for(int j=n;j>i;j--){
if(h[i] > h[j]){
dpd[i] = max(dpd[i],dpd[j]+1);
}
}
}
int ans=0;
for(int i=1;i<=n;i++){
ans = max(ans,dpi[i]+dpd[i]);
}
//因为中间的人重复计算了
printf("%d\n",n-ans+1);
}
return 0;
}
码后反思
- 还要加深对LIS中
dp
数组含义的理解!