题目:
见紫书;
思路都是根据紫书来的,然后重点是学习了一下利用结构体自定义矩阵的方法,这个方法确实比直接两两比较是否能够嵌套优化了很多;
大佬的代码:https://blog.csdn.net/lilele12211104/article/details/52524171
菜鸡的代码:
#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
const int maxn=100+5;
int depth[maxn];
int edg[maxn][maxn];
int n,t;
struct EDG
{
int w;
int l;
EDG() {}
EDG(int a,int b) : w(a),l(b) {}
bool operator<(const EDG&c) const
{
if((w<c.w&&l<c.l)||(w<c.l&&l<c.w))
return true;
return false;
}
}Edg[maxn];
int dp(int i)
{
int& ans=depth[i];
if(ans>0)
return ans;
ans=1;
for(int j=0;j<n;j++)
{
if(edg[i][j])
ans=max(ans,dp(j)+1);
}
return ans;
}
/*void printf_ans(int i,int j)
{
if(j!=1)
printf("->%d",i);
for(int k=0;k<n;k++)
{
if(edg[i][k]&&depth[i]==depth[k]+1)
{
printf_ans(k,0);
break;
}
}
}*/
int main()
{
int i,j,a,b;
scanf("%d",&t);
while(t--)
{
memset(edg,0,sizeof(edg));
memset(depth,0,sizeof(depth));
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d %d",&a,&b);
Edg[i]=EDG(a,b);
}
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
if(j!=i)
{
if(Edg[i]<Edg[j])
edg[i][j]=1;
}
}
int ans=0;
int first=-1;
for(i=0;i<n;i++)
{
depth[i]=dp(i);
if(ans<depth[i])
{
ans=depth[i];
first=i;
}
}
//printf("%d",first);
//printf_ans(first,1);
printf("\n%d\n",ans);
}
return 0;
}