洛谷 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