题解
2024-03-17 11:06:01
发布于:陕西
12阅读
0回复
0点赞
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct Data {
int w,h;
int id; //元素在序列中的编号
}D[5002]; //这是一个队列,只存储符合题意要求的元素
int head,f[5002],from[5002];
bool Compare(const Data &a,const Data &b) {
return a.w<b.w; //升序排列
}
void Print(int p) { //输出序列
if(p==-1)
return ;
Print(from[p]);
printf("%d ",D[p].id);
}
int main() {
int n,w,h,ans=1,p=0;
scanf("%d%d%d",&n,&w,&h);
for(int i,j,k=1;k<=n;++k) {
scanf("%d%d",&i,&j);
if(w<i&&h<j) { //符合题目要求的元素入队
D[head].w=i;
D[head].h=j;
D[head++].id=k;
}
}
if(head) {
sort(D,D+head,Compare);
for(int i=0;i<head;++i) {
f[i]=1;
from[i]=-1; //初始化
}
for(int i=1;i<head;++i) { //普通的求LIS的循环
for(int j=0;j<i;++j) {
if(D[j].w<D[i].w&&D[j].h<D[i].h&&f[j]+1>f[i]) {
f[i]=f[j]+1;
from[i]=j; //同时更新指针数组
}
}
if(ans<f[i]) {
ans=f[i]; //在f数组中寻找最大值,同时更新头指针
p=i;
}
}
printf("%d\n",ans);
Print(p);
}
else //此处是一个特判,如果没有符合题意的元素,那么输出0
printf("0");
return 0;
}
这里空空如也
有帮助,赞一个