题意:给出n个人的身高,让我们删除一些人,使得剩下的人的身高呈现“V(倒过来)”

思路:对每个位置分别枚举,每次枚举走两边最长上升子序列

P1091 合唱队形_子序列P1091 合唱队形_#include_02
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int maxn=1e2+10;
 4 int a[maxn];
 5 int dp[maxn];
 6 int main()
 7 {
 8     int n;
 9     scanf("%d",&n);
10     for(int i=1;i<=n;i++){
11         scanf("%d",&a[i]);
12     }
13     int ans=1;
14     for(int i=1;i<=n;i++){
15         for(int j=1;j<=i;j++){
16             dp[j]=1;
17             for(int k=1;k<j;k++){
18                 if(a[j]>a[k]) dp[j]=max(dp[j],dp[k]+1);
19             }
20         }
21         int tmp1=dp[i];
22         dp[i]=0;
23         for(int j=n;j>=i;j--){
24             dp[j]=1;
25             for(int k=n;k>j;k--){
26                 if(a[j]>a[k]) dp[j]=max(dp[j],dp[k]+1);
27             }
28         }
29         int tmp2=dp[i];
30         ans=max(ans,tmp1+tmp2-1);
31        // printf("ans:%d\n",ans);
32     }
33     printf("%d\n",n-ans);
34     return 0;
35 }
View Code