初步理解:最长上升子序列和最长不下降子序列(动态规划)_Elephant_King的博客-优快云博客
本文本次探讨,最长上升子序列,最长不下降子序列,最长下降子序列,最长不上升子序列
与这个序列倒序后的最长上升子序列,最长不下降子序列,最长下降子序列,最长不上升子序列
与反向遍历的最长上升子序列,最长不下降子序列,最长下降子序列,最长不上升子序列
共12个序列之间的关系
测试数据
14
13 7 9 16 38 24 37 18 44 19 21 22 63 15
将12个dp数组列出
13 | 7 | 9 | 16 | 38 | 24 | 37 | 18 | 44 | 19 | 21 | 22 | 63 | 15 | ||
dp1 | 最长上升子序列 | 1 | 1 | 2 | 3 | 4 | 4 | 5 | 4 | 6 | 5 | 6 | 7 | 8 | 3 |
dp2 | 最长不下降子序列 | 1 | 1 | 2 | 3 | 4 | 4 | 5 | 4 | 6 | 5 | 6 | 7 | 8 | 3 |
dp3 | 最长下降子序列 | 1 | 2 | 2 | 1 | 1 | 2 | 2 | 3 | 1 | 3 | 3 | 3 | 1 | 4 |
dp4 | 最长不上升子序列 | 1 | 2 | 2 | 1 | 1 | 2 | 2 | 3 | 1 | 3 | 3 | 3 | 1 | 4 |
dp5 | 反向遍历的最长上升子序列 | 2 | 1 | 1 | 2 | 4 | 3 | 3 | 2 | 3 | 2 | 2 | 2 | 2 | 1 |
dp6 | 反向遍历的最长不下降子序列 | 2 | 1 | 1 | 2 | 4 | 3 | 3 | 2 | 3 | 2 | 2 | 2 | 2 | 1 |
dp7 | 反向遍历的最长下降子序列 | 7 | 8 | 7 | 6 | 3 | 4 | 3 | 5 | 2 | 4 | 3 | 2 | 1 | 1 |
dp8 | 反向遍历的最长不上升子序列 | 7 | 8 | 7 | 6 | 3 | 4 | 3 | 5 | 2 | 4 | 3 | 2 | 1 | 1 |
逆序后 | 15 | 63 | 22 | 21 | 19 | 44 | 18 | 37 | 24 | 38 | 16 | 9 | 7 | 13 | |
dp9 | 最长上升子序列 | 1 | 2 | 2 | 2 | 2 | 3 | 2 | 3 | 3 | 4 | 2 | 1 | 1 | 2 |
dp10 | 最长不下降子序列 | 1 | 2 | 2 | 2 | 2 | 3 | 2 | 3 | 3 | 4 | 2 | 1 | 1 | 2 |
dp11 | 最长下降子序列 | 1 | 1 | 2 | 3 | 4 | 2 | 5 | 3 | 4 | 3 | 6 | 7 | 8 | 7 |
dp12 | 最长不上升子序列 | 1 | 1 | 2 | 3 | 4 | 2 | 5 | 3 | 4 | 3 | 6 | 7 | 8 | 7 |
首先可以得到的就是,反向遍历和reverse以后的dp数组,dp数组是相互倒序的
13 | 7 | 9 | 16 | 38 | 24 | 37 | 18 | 44 | 19 | 21 | 22 | 63 | 15 | ||
dp1 | 最长上升子序列 | 1 | 1 | 2 | 3 | 4 | 4 | 5 | 4 | 6 | 5 | 6 | 7 | 8 | 3 |
dp2 | 最长不下降子序列 | 1 | 1 | 2 | 3 | 4 | 4 | 5 | 4 | 6 | 5 | 6 | 7 | 8 | 3 |
dp3 | 最长下降子序列 | 1 | 2 | 2 | 1 | 1 | 2 | 2 | 3 | 1 | 3 | 3 | 3 | 1 | 4 |
dp4 | 最长不上升子序列 | 1 | 2 | 2 | 1 | 1 | 2 | 2 | 3 | 1 | 3 | 3 | 3 | 1 | 4 |
dp5 | 反向遍历的最长上升子序列 | 2 | 1 | 1 | 2 | 4 | 3 | 3 | 2 | 3 | 2 | 2 | 2 | 2 | 1 |
dp6 | 反向遍历的最长不下降子序列 | 2 | 1 | 1 | 2 | 4 | 3 | 3 | 2 | 3 | 2 | 2 | 2 | 2 | 1 |
dp7 | 反向遍历的最长下降子序列 | 7 | 8 | 7 | 6 | 3 | 4 | 3 | 5 | 2 | 4 | 3 | 2 | 1 | 1 |
dp8 | 反向遍历的最长不上升子序列 | 7 | 8 | 7 | 6 | 3 | 4 | 3 | 5 | 2 | 4 | 3 | 2 | 1 | 1 |
逆序后 | 15 | 63 | 22 | 21 | 19 | 44 | 18 | 37 | 24 | 38 | 16 | 9 | 7 | 13 | |
dp9 | 最长上升子序列 | 1 | 2 | 2 | 2 | 2 | 3 | 2 | 3 | 3 | 4 | 2 | 1 | 1 | 2 |
dp10 | 最长不下降子序列 | 1 | 2 | 2 | 2 | 2 | 3 | 2 | 3 | 3 | 4 | 2 | 1 | 1 | 2 |
dp11 | 最长下降子序列 | 1 | 1 | 2 | 3 | 4 | 2 | 5 | 3 | 4 | 3 | 6 | 7 | 8 | 7 |
dp12 | 最长不上升子序列 | 1 | 1 | 2 | 3 | 4 | 2 | 5 | 3 | 4 | 3 | 6 | 7 | 8 | 7 |
注意:1.最长上升子序列和逆序的最长下降子序列(不是反向遍历,是reverse),虽然dp数组不同但是通过下面代码求结果时用的结果都是一样的
其他的也是同理
stack<int> s;
for(int i=ans;i>=0;i--){
if(dp[i]==mmax){
s.push(v[i]);
mmax--;
}
}
while(!s.empty()){
cout<<s.top()<<" ";
s.pop();
}
正序的最长上升子序列代表这个数前面有几个比他小的
反向遍历的最长上升子序列代表这个数后面有几个比他小的