题目:
题解:
一道典型的最长递增子序列问题
不过是变成二维的,所以我们只需要用结构体快排它,让它变成我们想要的顺序即可,而且只让长大于宽
AC代码:
#include<bits/stdc++.h>
using namespace std;
#define maxn 1005
struct node
{
int lon,wid;//长和宽
} temp[maxn];
int dp[maxn];
int n;
bool cmp(node x,node y)
{
if(x.lon==y.lon)
return x.wid<y.wid;
return x.lon<y.lon;
}
void s_dp()
{
memset(dp,0,sizeof(dp));
//dp[0]=1;
for(int i=1; i<=n; i++)
{
dp[i]=1;
int lonx=temp[i].lon;
int widx=temp[i].wid;
for(int j=1; j<i; j++)
{
if((lonx>temp[j].lon&&widx>temp[j].wid))
{
dp[i]=max(dp[i],dp[j]+1);
// lonx=temp[j].lon;
// widx=temp[j].wid;
}
}
}
int maxx=1;
for(int i=1; i<=n; i++)
{
if(maxx<dp[i])
maxx=dp[i];
}
printf("%d\n",maxx);
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(int i=1; i<=n; i++)
{
scanf("%d %d",&temp[i].lon,&temp[i].wid);
if(temp[i].lon<temp[i].wid)
{
swap(temp[i].lon,temp[i].wid);
}
}
sort(temp+1,temp+n+1,cmp);
s_dp();
}
}