最长上升子序列(动态规划)

最长上升子序列(动态规划)

给定一个长度为 NN 的数列,求数值严格单调递增的子序列的长度最长是多少。

输入格式

第一行包含整数 NN。

第二行包含 NN 个整数,表示完整序列。

输出格式

输出一个整数,表示最大长度。

数据范围

1≤N≤1000,
\(−10^9\)≤数列中的数≤\(10^9\)

输入样例:

7
3 1 2 1 8 5 6

输出样例:

4

思想

  • 状态表示:f[i]表示从第一个数字开始算,以a[i]结尾的最大的上升序列。(以a[i]结尾的所有上升序列中属性为最大值的那一个)

  • 状态转换方程 f[i] = max(f[i], f[j] + 1), 其中j∈(0,1,2,..,i-1), 由于a[i]如果小于等于a[j],不满足题意,所以需判断。

  • 有一个边界,若前面没有比i小的,f[i]为1(自己为结尾)。

  • 最后f[i],表示每个到w[i]截止的最长子序列长度。

  • 比较f[i]取最大值。

c++代码
#include <iostream>
using namespace std;
int main(){
	int n;
	int a[1000],f[1000];
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>a[i];
	}
	int m=1;
	for(int i=0;i<n;i++){
		f[i]=1;
		for(int j=0;j<i;j++){
			if(a[j]<a[i]) f[i]=max(f[i],f[j]+1);//动态规划法 状态转移方程 f [ i ] = max (f [ i ], f[ j ] + 1);
		}
		m=max(m,f[i]);
	}
	cout<<m;	
	return 0;
} 
时间复杂度为 O(\(n^2\)
posted @ 2021-05-22 15:15  sleepzzw  阅读(115)  评论(0)    收藏  举报