int getLIS(vector<int> A, int n) { int * dp=new int[n]; 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]
动态规划--LIS练习
最新推荐文章于 2022-02-18 21:35:58 发布