动态规划求最长上升子序列两种算法

动态规划求最长上升子序列两种算法


一、 O ( N 2 ) {O(N^2)} O(N2)算法

#include
using namespace std;
int main(){
	int n;
	while(cin >> n){
	int v[n+1];
	for(int i = 1; i <= n; i++){
		cin >> v[i];
	} 
	int dp[n+1];
	for(int i = 0; i <= n; i++){
		dp[i] = 1;//以a[i]结尾的最长上升子序列的长度初始化为1
	}
	for(int i = 1; i <= n; i++){
		for(int j = 1; j < i; j++){
			if(v[j] <= v[i])//更新长度。如果求最长下降子序列,就把<改成>
				dp[i] = max(dp[i], dp[j]+1);
		}
	}
	sort(dp+1, dp+n+1);//排个序,找到最大的长度
	cout << dp[n] << endl;
}
return 0;
} 

二、 O ( N l o g ( N ) ) {O(Nlog(N))} O(Nlog(N))算法

#include
using namespace std;
int main(){
	int n;
	while(cin >> n){
		int a[n+1];
		for(int i = 1; i <= n; i++){
			cin >>a[i];
		}
		//如果求最长下降子序列,就加上下面一句,先排个序就OK。
		//reverse(a+1, a+n+1);
		vector<int>v;//存储长度对应的值。v[i]表示长度为i+1的最大子序列的最后一个元素的最小值 
		v.push_back(a[1]);//第一个数直接放进去 
		for(int i = 2; i <= n; i++){
			if(a[i] < *v.rbegin()){
				auto pos = lower_bound(v.begin(), v.end(), a[i]);
				*pos = a[i];//当前替换成较小的数 
			}else{
				v.push_back(a[i]);//长度增加 
			}
		}	
		cout << v.size() << endl;
	}
return 0;
} 

你可能感兴趣的:(算法,动态规划)