最长上升公共子序列

int dp[1005];
int a[1005],b[1005];

/*
dp[i][j]表示考虑a的前i个元素,b的前j个元素且以b[j]结尾的最长上升公共子序列长度
当a[i]!=b[j]时  dp[i][j] = dp[i-1][j]  第i个元素没用,b[j]一定是与前面的某个元素(或者啥也没有)配对
当a[i]==b[j]时  dp[i][j] = max{dp[i-1][k]+1}  第i个元素与第j个元素配对,去前面找小于b[j]的结尾连接上去 
*/ 

int LICS(int n)  //求两个序列的最长公共子序列 
{
	//压缩一维,在a[i]确定时,需要用到dp[k]时的b[j]已经确定,所以枚举时就维护了这个最大的dp[k] 
	int res = 0;
	for (int i = 1; i <= n; i++)   //考虑前i个a[i] 
	{
		int max_dp;     //用于记录a[i]与b[j]配对时前面可转移的最大值 
		for (int j = 1; j <= n; j++)  //考虑前j个b[j],且dp[j]必须以j结尾 
		{
			if( a[i] > b[j] ) max_dp = max(max_dp,dp[j]);  //a[i]大于当前这个b[j],在后面b[j]等于a[i]时可能会用到这个j 
			else if( a[i] == b[j] ) dp[j] = max_dp + 1;    //等于时就用维护的最大值加1即可 
			res = max(res,dp[j]);
		}
	}	
	return res;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值