经典动态规划之最长上升子序列

来源:互联网 发布:专业网络k歌声卡 编辑:程序博客网 时间:2024/06/07 09:57
/****************************************************    > File Name: lis.cpp    > Author: Yuji CAO    > Mail: 1007171627@qq.com     > Created Time: 五  6/ 2 19:42:39 2017 ****************************************************/#include<map>#include<vector>#include<unordered_set>#include<unordered_map>#include<list>#include<queue>#include<deque>#include<stack>#include<iostream>#include<set>#include<limits>using namespace std;/** *  3   4   2   7   8   4   9   10  11  6 * dp 更新过程 *<3>  3   o   o   o   o   o   o   o   o   o *<4>  3   4   o   o   o   o   o   o   o   o *<2>  2   4   o   o   o   o   o   o   o   o *<7>  2   4   7   o   o   o   o   o   o   o *<8>  2   4   7   8   o   o   o   o   o   o *<4>  2   4   4   8   o   o   o   o   o   o *<9>  2   4   4   8   9   o   o   o   o   o *<10> 2   4   4   8   9   10  o   o   o   o *<11> 2   4   4   8   9   10  11  o   o   o *<6>  2   4   4   6   9   10  11  o   o   o */int lis(vector<int>& array) {    vector<int> dp(array.size() + 1, numeric_limits<int>::max());    for (int i = 0; i < array.size(); ++i) {        auto pos = upper_bound(dp.begin(), dp.end(), array[i]) - dp.begin();        dp[pos] = array[i];    }    for (auto ele : dp)cout<<ele<<"\t";    cout<<endl;    int end_pos = array.size() - 1;    while (end_pos >= 0 && dp[end_pos] == numeric_limits<int>::max()) {        end_pos -= 1;    }    return end_pos + 1;}int main() {    int n = 0;    cin>>n;    vector<int> array;    for (int i = 1; i <= n; ++i) {        int tmp;        cin>>tmp;        array.push_back(tmp);    }    int ans = lis(array);    cout<<"answer:\t"<<ans<<endl;    return 0;}
原创粉丝点击