题目描述:
- 编程之美2.16中,求数组最长递增子序列的长度,例如数组为:1,-1,2,-3,4,-5,6,-7,那么最长递增序列是:1,2,4,6,长度是4.
- 可以看出,子序列不一定是连续的
解题思路:
- 动态规划问题;
- 使用 i 表示向前遍历的位置,当 i=1时,序列为 1,长度为1;
- 当 i=2时,序列为 1 或者 -1,长度仍为1;
- 当 i=3时, 序列为 1,2或者 -1,2,长度为2;
- 因此,初始化最大长度为1,以第i个元素结尾的最长子序列的长度为 max(ret[j] + 1, ret[i])
- 时间复杂度为O(n*n)
int LIS(vector<int> & nums)
{
int n = nums.size();
vector<int> ret(n, 1);
for(int i = 0; i < n; ++i)
{
for(int j = 0; j < i; ++j)
{
if(nums[i] > nums[j] && ret[j] + 1 > ret[i])
ret[i] = ret[j] + 1;
}
}
for(int i = 1; i < n; ++i)
{
if(ret[i] < ret[i - 1])
swap(ret[i], ret[i - 1]);
}
return ret[n - 1];
}
最长递增子序列的和:
def Sum(A):
n = len(A)
ret = []
for i in range(n):
ret.append(A[i])
for i in range(1,n):
for j in range(i):
if A[i] > A[j] and ret[j] + A[i] > ret[i]:
ret[i] = ret[j] + A[i]
#print A[i]
return max(ret)