最长递增子序列

来源:互联网 发布:listview的优化 编辑:程序博客网 时间:2024/06/05 03:08

使用动态规划
dp数组里面每个元素对应一个当前能取得的最大的递增子序列的值。从头开始遍历,每到一个元素,就往前找,满足一下两个条件的:

  1. 比当前元素小
  2. dp值最大的那个

则当前元素的dp值等于之前元素比他小但是dp值最大再加上1.
只是找出长度的话,只需要遍历dp数组找到最大值就好了,但是如果要是找出序列,必须从后往前,dp值一次减小,对应的序列才是最终输出。

int findLongest(vector<int> A, int n) {    size_t t = A.size();    vector<int> dp(t,1);    for (int i = 1; i < t;i++)    {        int min = i;        int dpmax = 0;        for (int j = i - 1; j >= 0;j--)        {            if (A[i]>A[j] && dpmax<dp[j])            {                dpmax = dp[j];            }        }        dp[i] = dpmax + 1;    }    / *******只是找出长度******* /    / *sort(dp.begin(), dp.end());    auto it = dp.end() - 1;    return *it;* /    auto it = max_element(dp.begin(), dp.end());//  return *it;    / *******只是找出长度******* /    / *******找出子序列******* /    int curdp = *it;    deque<int> q;    for (int i = n - 1; i >= 0 && curdp>=1; i--)    {        if (dp[i]==curdp)        {            q.push_front(A[i]);            curdp--;        }    }    for (int s:q)    {        cout << s << " ";    }    / *******找出子序列******* /    return 0;}