洛谷 P1091 合唱队形 & [NOIP2004提高组](LIS)

传送门


解题思路

先说我的思路:枚举中间的那个人,然后在左边序列、右边序列分别做一次LIS,时间复杂度为n^3。

看题解后才发现有更优的做法,我们可以先预处理出正向和反向的LIS,然后枚举i统计答案即可,时间复杂度为n^2。

AC代码

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cmath>
 4 #include<cstdio>
 5 #include<cstring>
 6 using namespace std;
 7 int n,a[105],dp1[105],dp2[105],ans;
 8 int main()
 9 {
10     cin>>n;
11     for(int i=1;i<=n;i++) cin>>a[i];
12     for(int i=1;i<=n;i++) {
13         dp1[i]=1;
14         for(int j=1;j<i;j++){
15             if(a[i]>a[j]) dp1[i]=max(dp1[i],dp1[j]+1);
16         }
17     }
18     for(int i=n;i>=1;i--){
19         dp2[i]=1;
20         for(int j=n;j>i;j--){
21             if(a[i]>a[j]) dp2[i]=max(dp2[i],dp2[j]+1);
22         }
23     }
24     for(int i=1;i<=n;i++) ans=max(ans,dp1[i]+dp2[i]-1);
25     cout<<n-ans;
26     return 0;
27 }

//NOIP2004提高组 t3

posted @ 2020-10-16 23:33  尹昱钦  阅读(147)  评论(0编辑  收藏  举报