LIS、LCS

36 篇文章 0 订阅
18 篇文章 0 订阅

LIS:Longest Increasing Subsequence

  • 朴素三角dp,注意初始化为1:
int ans = 0;
for(int i=0;i<N;i++){
	dp[i] = 1;//important
	for(int j=0;j<i;j++)
		if(A[i] > A[j])
			dp[i] = max(dp[i] , dp[j] + 1);
	ans = max(ans , dp[i]);
}
  • NlgN:
memset(dp , INF , sizeof(dp));
for(int i=0;i<N;i++)
	*lower_bound(dp , dp+N , A[i]) = A[i];
cout<<lower_bound(dp , dp+N , INF) - dp<<endl;
  • 也可以排序+LCS,但是没有必要。

LCS:Longest Common Subsequence

  • 朴素矩形dp,注意向后腾出一枚空间:
memset(dp , 0 , sizeof(dp))for(int i=0;i<l.length();i++)
	for(int j=0;j<r.length();j++)
		if(l[i] == r[j])
			dp[i+1][j+1] = dp[i][j] + 1;
		else
			dp[i+1][j+1] = max(dp[i+1][j] , dp[i][j+1]);
cout<<dp[l.length()][r.length()]<<endl;
  • 滚动数组dp:注意为什么需要留下两维:必须先写矩形,再根据矩形优化到滚动数组
memset(dp , 0 , sizeof(dp));
int t = 0 ;
for(int i=0;i<l.length();i++){
	t = 1 - t;
	for(int j=0;j<r.length();j++)
		if(l[i] == r[j])
			dp[t][j+1] = dp[1-t][j] + 1;
		else
			dp[t][j+1] = max(dp[t][j] , dp[1-t][j+1]); 
}
cout<<dp[l.length()%2][r.length()]<<endl;
  • NlgN:记录位置,再NlgN做LIS,但是在重复元素较多时,一般并不能真正起到效果
int cnt = 0;
for(int i=0;i<l.length();i++)
	for(int j=r.length();j>=0;j--)
		if(l[i] == r[j])
			F[++cnt] = j;
memset(dp , INF , sizeof(dp));
for(int i=1;i<=cnt;i++) 
	*lower_bound(dp , dp+cnt , F[i]) = F[i];
cout<<lower_bound(dp , dp+cnt , INF) - dp<<endl;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值