动态规划--LIS练习
2018-04-10 05:15
183 查看
int getLIS(vector<int> A, int n) { int * dp=new int ; for (int i = 0; i < n; i++) { dp[i] = 1; } for (int i = 1; i < n; i++) { int max = 0; for (int j = 0; j < i; j++) { if (A[i] > A[j])//当A[i]之前的数都比其小,找出A[i]之前最大递增子序列中最大的再加上1就是现在的最大 max = max > dp[j] ? max : dp[j]; } dp[i] = max + 1; } int a = 0; for (int j = 0; j < n; j++) { if (a < dp[j]) a = dp[j]; } return a; }
这是一个经典的LIS(即最长上升子序列)问题,请设计一个尽量优的解法求出序列的最长上升子序列的长度。
给定一个序列A及它的长度n(长度小于等于500),请返回LIS的长度。
思路:
对于arr[0]来说,dp=1,即最大递增子序列只有arr[0],接下来从左到右依次算出每个位置的数结尾的情况下,最长递增子序列的长度。
假设计算到位置i,求已知以arr[i]结尾的情况下的最长递增子序列的长度,即dp[i]的值,如果最长递增子序列必须以arr[i]结尾,那么在arr[0…i-1]中,所有比arr[i]小的数,都可以作为倒数第二个数,那么在最么多选择中,以哪个数结尾的最大递增子序列更大就选择那个数最为倒数第二个数。
如果arr[0…i-1]中所有的数都不比arr[i]小,那么就令dp[i]=1,说明在必须以arr[i]结尾的情况下,最大递增子序列都只包含arr[i]
相关文章推荐
- 数据结构 练习 16-动态规划
- 动态规划 — LIS
- 动态规划初级练习(一):ZigZag
- 算法——动态规划练习
- 非 动态规划---LIS
- 动态规划练习--09(移动路线)
- 动态规划练习一 26题
- 动态规划练习——最长上升子序列
- 动态规划练习04:公共子序列
- 动态规划练习——登山
- 动态规划练习 8
- HDU 3555 浅谈数位动态规划逆向计数问题练习
- 算法练习--- DP 求解最长上升子序列(LIS)
- 动态规划 LIS
- 动态规划-求LIS和时间优化
- 动态规划-最长上升子序列LIS
- NYOJ - 17 - 单调递增最长子序列(动态规划--LIS--单调递增最长子序列)
- 【动态规划】Move ahead, 初级, LIS 程序完成
- HDU 1069 Monkey and Banana (动态规划+LIS)
- 动态规划练习一 06:登山