[華爲OJ] 合唱團

思路:

看作最長升序子序列和最長降序子序列的拼接。

取數組中第i個人爲合唱團最高的人,則組成合唱隊人數爲,隊列首到位置i 的最長上升子序列長度 + 從位置 i 到隊尾的最長下降子序列長度。 


代碼:

#include <iostream>      
#include <vector>  
using namespace std;    
void getLs(vector<int> nums, int size, vector<int>& ls);      
void getRs(vector<int> nums, int size, vector<int>& rs);      
      
void main(){      
    int size;      
    cin >> size;      
    if(size == 0 || size == 1) cout << 0;      
    vector<int> input(size,0);      
    for(int i = 0; i < size; i++){      
        cin >> input[i];      
    }      
    vector<int> ls(size,1);      
    vector<int> rs(size,1);      
    getLs(input,size,ls);      
    getRs(input,size,rs);      
    int t = 0, index = 0;      
    for(int i = 1; i < size; i++){      
        if(ls[i] + rs[i] > t){      
            t = ls[i] + rs[i];      
            index = i;      
        }      
    }      
    cout << size - ls[index] - rs[index] + 1;      
          
             
}      
void getLs(vector<int> nums, int size, vector<int>& ls){      
    for(int i = 1; i < size; i++){      
        for(int j = 1; j < i; j++){      
            if(nums[j] < nums[i] && ls[j] + 1 > ls[i])      
                ls[i] = ls[j] + 1;      
        }      
    }      
}      
void getRs(vector<int> nums, int size, vector<int>& rs){      
    for(int i = size - 1; i >= 1; i--){      
        for(int j = size - 1; j >= i; j--){      
            if(nums[i] > nums[j] && rs[j] + 1 > rs[i])      
                rs[i] = rs[j] + 1;      
        }      
    }      
}      


發佈了26 篇原創文章 · 獲贊 1 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章