一、题目链接
https://www.nowcoder.com/practice/cf209ca9ac994015b8caf5bf2cae5c98?tpId=40&rp=1&ru=%2Fta%2Fkaoyan&qru=%2Fta%2Fkaoyan%2Fquestion-ranking&tab=answerKey
二、代码
1 #include<bits/stdc++.h>
2 #define maxn 105
3 using namespace std;
4 int T[maxn],a[maxn],b[maxn];
5 /*注意:
6 之前的【求最长递增子列长度】问题里的dp[i]的值是1到i序列里最长递增子列的长度,这个最长递增子列并不一定是以i为尾。
7 而本题的最长子列问题,a[i]是以i点为尾的最长递增子列
8 算法思路:分别从前往后和从后往前寻找以i点为尾的最长子列,寻找两个子列和的最大值*/
9 int main(){
10 int n,m;
11 cin>>n;
12 for(int i=0;i<n;i++){
13 cin>>T[i];
14 a[i]=1,b[i]=1;
15 }
16 for(int i=1;i<n;i++){
17 m=a[i];
18 for(int j=i-1;j>=0;j--){/*从前往后寻找以i点为尾的最长递增子列*/
19 if(T[j]<T[i]) m=max(m,a[j]+1);
20 }
21 a[i]=m;
22 }
23 for(int i=n-1;i>=0;i--){/*从后往前寻找以i点为尾的最长递增子列*/
24 m=b[i];
25 for(int j=i+1;j<n;j++){
26 if(T[j]<T[i]) m=max(m,b[j]+1);
27 }
28 b[i]=m;
29 }
30 for(int i=1;i<n;i++){ /*寻找点i两个子列和的最大值*/
31 m=max(a[i]+b[i],m);
32 }
33 cout<<n-m+1<<endl;
34 }