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;
}