题意,找出严格递增或递减的曲线中包含最多的点的个数。
思路,先将点按照x递增排序再按y递增或递减找点。
代码:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstdlib>
using namespace std;
int MaxLen[1000];
struct node {
int x;
int y;
};
node Height[1000];
int LIS(int k) {
memset(MaxLen,0,sizeof(MaxLen));
for(int i = 1; i <= k; i++) {
MaxLen[i] = 1;
for(int j = 1; j < i; j++) {
if(Height[i].y<Height[j].y) {
int preMax = MaxLen[j] + 1;
if(preMax > MaxLen[i]) {
MaxLen[i] = preMax;
}
}
}
}
int MAX=0;
for(int i=1; i<=k; i++) {
if(MAX<MaxLen[i]) {
MAX=MaxLen[i];
}
}
return MAX;
}
int LIS2(int k) {
memset(MaxLen,0,sizeof(MaxLen));
for(int i = 1; i <= k; i++) {
MaxLen[i] = 1;
for(int j = 1; j < i; j++) {
if(Height[i].y>Height[j].y) {
int preMax = MaxLen[j] + 1;
if(preMax > MaxLen[i]) {
MaxLen[i] = preMax;
}
}
}
}
int MAX=0;
for(int i=1; i<=k; i++) {
if(MAX<MaxLen[i]) {
MAX=MaxLen[i];
}
}
return MAX;
}
bool cmp(node a,node b) {
if(a.x==b.x) {
return a.y<b.y;
}
return a.x<b.x;
}
int main() {
int T;
int n;
scanf("%d",&T);
while(T--) {
scanf("%d",&n);
for(int i=1; i<=n; i++) {
scanf("%d%d",&Height[i].x,&Height[i].y);
}
sort(Height+1,Height+n+1,cmp);
printf("%d\n",max(LIS(n),LIS2(n)));
}
return 0;
}