算法之动态规划之合唱队

 

 

分析和思路:

先求出每个元素的最长的递增队列,再求每个元素最长的递减队列,再把每个元素的最长的递增和递减加一起最大值就是所需要求的值。记得是逆向覆盖。

 1 #include<iostream>
 2 #include<vector>
 3 using namespace std;
 4 //https://www.nowcoder.com/practice/6d9d69e3898f45169a441632b325c7b4?tpId=37&rp=1&ru=%2Fta%2Fhuawei&qru=%2Fta%2Fhuawei&difficulty=&judgeStatus=&tags=&title=&gioEnter=menu
 5 int main(){
 6     int num;
 7     while(cin>>num){
 8         vector<int> temp;
 9         vector<int> dp_up(num,1);
10         vector<int> dp_down(num,1);
11         for(int i=0;i<num;i++){
12             int a;
13             cin>>a;
14             temp.push_back(a);
15         }
16         //dp_up[i]最长上升子序列个数
17         for(int i=1;i<temp.size();i++){
18             for(int j=i-1;j>=0;j--){
19                 if(temp[j]<temp[i]){
20                     dp_up[i]=max(dp_up[i],dp_up[j]+1);
21                 }
22             }
23         }
24         //dp_down[i]最长下降子序列个数
25         for(int i=temp.size()-2;i>=0;i--){
26             for(int j=i+1;j<temp.size();j++){
27                 if(temp[j]<temp[i]){
28                     dp_down[i]=max(dp_down[i],dp_down[j]+1);
29                 }
30             }
31         }
32         int maxvalue=0;
33         for(int i=0;i<temp.size();i++){
34             if(dp_up[i]+dp_down[i]>maxvalue)
35                 maxvalue=dp_up[i]+dp_down[i];
36         }
37         cout<<num-(maxvalue-1)<<endl;
38 
39     }
40 }

 

posted @ 2022-02-28 23:01  技术笔记记录  阅读(154)  评论(0)    收藏  举报