合唱队形-题解(变形的最长递增子序列)

一、题目链接

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 }
posted @ 2021-03-15 21:40  saaas  阅读(115)  评论(0)    收藏  举报