Bootstrap

动态规划-最长非降子序列LIS

动态规划-最长非降子序列LIS

题目描述

        LIS问题:求序列的最长非降(升序)子序列的长度

5 3 4 1 8 7 9
        我们看上面这个序列。
        显然,5和3不能构成非降子序列。3和4就可以构成非降子序列。以此类推。最长的非降子序列是3479。

        朴素解法:不一定得到最优解,无效的解法 但是要求算法时间复杂度:O(n^2)。

解题思路

        动态规划算法解决

代码实现

#include <iostream>
#include <algorithm>
using namespace std;

int main()
{
	int ar[] = { 5, 3, 4, 1, 8, 6, 7, 10 };
	const int n = sizeof(ar) / sizeof(ar[0]);
	int dp[n] = { 0 };
	int maxval = 0;//初始化最大值

	for (int i = 0; i < n; ++i)
	{  //O(n)
		dp[i] = 1;//因为每个元素可以自己构成一个非降子序列
		for (int j = 0; j < i; ++j)
		{  //O(n)
			if (ar[j] <= ar[i] && 1 + dp[j] > dp[i])
			{
				dp[i] = 1 + dp[j];
			}
		}

		if (dp[i] > maxval)
		{
			maxval = dp[i];
		}
	}

	cout << maxval << endl;//5

	return 0;
}

运行结果

;