最长上升子序列(LIS)

最长上升子序列,又称LIS (Longest Increasing Subsequence)是动态规划的一个经典应用。

在原序列取任意多项,不改变他们在原来数列的先后次序,得到的序列称为原序列的子序列。最长上升子序列,就是给定序列的一个最长的、数值从低到高排列的子序列,最长上升子序列不一定是唯一的。例如,序列2,1,5, 3,6,4,6,3的最长上升子序列为1,3,4,6和2,3,4,6,长度均为4

int a[8] = {2,1,5,3,6,4,6,3}; 
int dp[8];

int main()
{
	int ans = 0;
	for(int i = 0; i < 8; i++){
		dp[i] = 1;//必须初始化为1, 如果有一项前面没有<它的,那以它为止的最长上升子序列就为1,而不是0
		for(int j = i-1; j >= 0; j--){
			
			if(a[j] < a[i])
				dp[i] = max(dp[i], dp[j] + 1); //找到i前面最大的dp,并赋值给dp[i]
		}
		ans = max(dp[i], ans);//找到最长上升子序列长度
	}	
	for(int i = 0; i < 8; i++)
		cout << dp[i] << " ";
	cout << endl;
	cout << ans; 
	return 0;
}

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值