合唱队形

链接

分析:对前半部分求最长上升,对后半部分,求最长下降,二者的最大值即为所求,注意重复的部分

 1 #include "iostream"
 2 #include "cstdio"
 3 #include "cstring"
 4 #include "string"
 5 using namespace std;
 6 const int maxn=110;
 7 int dp1[maxn],dp2[maxn];
 8 int n;
 9 int h[maxn];
10 int main()
11 {
12     cin>>n;
13     for(int i=1;i<=n;i++)
14         cin>>h[i];
15     int ans=0;
16     for(int i=1;i<=n;i++){
17         dp1[i]=1;
18         for(int j=1;j<i;j++){
19             if(h[j]<h[i]&&dp1[i]<dp1[j]+1)
20                 dp1[i]=dp1[j]+1;
21         }
22     }
23     for(int i=n;i>=1;i--){
24         dp2[i]=1;
25         for(int j=i+1;j<=n;j++){
26             if(h[j]<h[i]&&dp2[i]<dp2[j]+1)
27                 dp2[i]=dp2[j]+1;
28         }
29     }
30     for(int i=1;i<=n;i++)
31         ans=max(ans,(dp1[i]+dp2[i]));
32     cout<<(n-(ans-1))<<endl;
33     return 0;
34 }
View Code
原文地址:https://www.cnblogs.com/wolf940509/p/7012069.html