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

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


一、 O ( N 2 ) {O(N^2)} O(N2)算法
#include<bits/stdc++.h>
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<bits/stdc++.h>
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;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值