CF4D Mysterious Present(二维LIS)

CF4D Mysterious Present(二维LIS)

原题链接

思路:

一维的话考虑n^2和nlogn两种写法,二维的话先对第一维进行排序,再对第二位做LIS。

注意是严格单调上升子序列

代码:

const int maxn=5100;
struct node{
	int w,h,id;
}a[maxn];
int ww,hh,n,cnt=0;
int dp[maxn],pre[maxn];
bool cmp(node a,node b){
	if(a.w==b.w) return a.h<b.h;
	return a.w<b.w;
}
void dfs(int pos){
	if(pos==-1) return ;
	dfs(pre[pos]);
	cout<<a[pos].id<<" ";
}
int main(){
	cin>>n>>ww>>hh;
	memset(pre,-1,sizeof pre);
	for(int i=1;i<=n;i++){
		int w,h;cin>>w>>h;
		if(w<=ww||h<=hh) continue;
		a[++cnt]={w,h,i};
	}
	sort(a+1,a+1+cnt,cmp);
	for(int i=1;i<=cnt;i++){
		dp[i]=1;
		for(int j=1;j<i;j++){
			if(a[j].w<a[i].w&&a[j].h<a[i].h&&dp[j]+1>dp[i]){
				 dp[i]=dp[j]+1;
				 pre[i]=j;
			}
		}
	}
	int res=0,pos=-1;
	for(int i=1;i<=cnt;i++)
		if(dp[i]>res) res=dp[i],pos=i;
	cout<<res<<endl;
	dfs(pos);
	return 0;
}







原文地址:https://www.cnblogs.com/OvOq/p/14706648.html