ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

ACM模板笔记:最长不下降/上升子序列,最长公共子序列(DP)

2021-03-13 18:02:32  阅读:193  来源: 互联网

标签:le int max mid ACM maxr 序列 最长 dp


这只是我个人的备忘录,没有详细的注解,想了解原理的请去找其他的贴子 ,如果你能看得懂就将就看:P

淦宁佬,能拿到蓝桥杯省二就算成功:(,ACM拿锤子奖,我这说唱专业的说唱学生百分百白给,是这样的

求最长不上升子序列
-1s算法

	int maxr = 0;
	for (int i = counter; i >= 1; i--) {
		dp[i] = 1;
		for (int j = i + 1; j <= counter; j++) {
			if (datas[j] <= datas[i]) {
				dp[i] = max(dp[i], dp[j] + 1);
			}
		}
		maxr = max(maxr, dp[i]);
	}
	cout << maxr << endl;

在这里插入图片描述
nlogn算法(在做了,在做了)

求最长不下降子序列
-1s算法

	int ans2 = 0;
	for (int i = 1; i <= counter; i++) {
		dp2[i] = 1;
		for (int j = 1; j < i; j++) {
			if (datas[j] < datas[i])
				dp2[i] = max(dp2[i], dp2[j] + 1);
		}
		ans2 = max(ans2, dp2[i]);
	}
	cout << ans2;

在这里插入图片描述

nlogn算法(在做了,在做了)

最长公共子序列

-1s做法

	for(int i=1;i<=n;i++)
	{
		dp[i]=1;//初始化 
		for(int j=1;j<i;j++)//枚举i之前的每一个j 
		if(data[j]<data[i] && dp[i]<dp[j]+1)
		//用if判断是否可以拼凑成上升子序列,
		//并且判断当前状态是否优于之前枚举
		//过的所有状态,如果是,则↓ 
		dp[i]=dp[j]+1;//更新最优状态 
		
	}

nlogn做法

	for(int i=1;i<=n;i++){
		int l=0,r=len,mid;
		if(map[b[i]]>f[len])f[++len]=map[b[i]];
		else {
			while(l<r){	
			    mid=(l+r)/2;
			    if(f[mid]>map[b[i]])r=mid;
				else l=mid+1; 
			}
			f[l]=min(map[b[i]],f[l]);
     	}
    }

这玩意也可以离散化(来自洛谷)
在这里插入图片描述

int n,a[100005];
int ans,ma,c[100005],b[100005],r[100005];
//二分
int fen(int x){
	int le=0,ri=ma,mid;
	while(le<ri){
		mid=(le+ri)/2+1;
		if(r[mid]>=x) ri=mid-1;
		else le=mid;
	}
	return le;
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i],c[a[i]]=i;
	for(int i=1;i<=n;i++){
		int x;
		cin>>x;
		b[i]=c[x];//这里做离散化
	}
	//然后就用普通的n^2
	int maxr = 0;
	for (int i = n; i >= 1; i--) {
		r[i] = 1;
		for (int j = i + 1; j <= n; j++) {
			if (b[j] <= b[i]) {
				r[i] = max(r[i], r[j] + 1);
			}
		}
		maxr = max(maxr, r[i]);
	}
	cout << maxr << endl;
	cout<<ans;
	return 0;
}

标签:le,int,max,mid,ACM,maxr,序列,最长,dp
来源: https://blog.csdn.net/qq_46207392/article/details/114751940

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有