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