算法之动态规划之合唱队
分析和思路:
先求出每个元素的最长的递增队列,再求每个元素最长的递减队列,再把每个元素的最长的递增和递减加一起最大值就是所需要求的值。记得是逆向覆盖。
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 }
主要为了自己学习