zoukankan      html  css  js  c++  java
  • [DP]最长递增子序列

    #include <iostream>
    #include <limits.h>
    #include <vector>
    #include <algorithm>
    
    using namespace std;
    
    //获取最长递增子序列的递增数组
    vector<int> getdp1(vector<int> arr) {
        vector<int> dp(arr.size());
        for (int i = 0; i < int(arr.size()); i ++) {
            dp[i] = 1;
            for (int j = 0; j < i; j ++) {
                if (arr[i] > arr[j])
                    dp[i] = max(dp[i], dp[j] + 1);
            }
        }
        return dp;
    }
    
    vector<int> getdp2(vector<int> arr) {
        int right = 0;
        int arr_len = int(arr.size());
        int ends[arr_len];
        int dp[arr_len];
        ends[0] = arr[0];
        dp[0] = 1;
        for (int i = 1; i < arr_len; i ++) {
            //二分查找ends
            int l = 0;
            int r = right;
            while (l <= r) {
                int mid = (l + r) >> 1;
                if (arr[i] > ends[mid])
                    l = mid + 1;
                else
                    r = mid - 1;
            }
        }
    }
    
    // 从dp数组中逆序还原出决策路径
    vector<int> generateLIS(vector<int> dp, vector<int> arr) {
        vector<int>::iterator  maxPosition = max_element(dp.begin(), dp.end()); //algorithm中求vector最大值的函数
        int maxIndex = maxPosition - dp.begin();
        int maxNum = *maxPosition;
        vector<int> res;
        res.push_back(arr[maxIndex]);
        int tmpNum = maxNum;
        for (int i = maxIndex - 1; i >= 0; i --) {
            if (dp[i] == tmpNum - 1) {
                res.push_back(arr[i]);
                tmpNum -= 1;
            } else continue;
        }
        reverse(res.begin(), res.end());
        return res;
    }
    
    int main()
    {
        vector<int> test = {2, 1, 5, 3, 6, 4, 8, 9, 7};
        vector<int> dp =  getdp1(test);
        vector<int> lis = generateLIS(dp, test);
    //    cout<<"LIS"<<lis.size()<<endl;
        for (auto c: lis)
            cout<<c<<endl;
    
        return 0;
    }
    
  • 相关阅读:
    RAP开发入门-主题更换
    RAP开发入门-开发笔记-bug记录
    RAP开发入门-运行过程简析(三)
    Redis入门笔记-redis内部数据结构(01)
    JAVA基础-子类继承父类实例化对象过程
    RAP开发入门-开发笔记
    RAP开发入门-运行第一个HelloWorld(二)
    android maven eclipse
    字符与编码(摘录)
    Python 学习lesson 1
  • 原文地址:https://www.cnblogs.com/mooba/p/7473539.html
Copyright © 2011-2022 走看看