Key Point: sort the dimension of each box to determine whether a box can be placed in another box.
After creating a graph, find the longest path in the graph.
View code
# Include <stdio. h>
# Include < String . H>
# Include <algorithm>
Using Namespace STD;
Const Int INF = 100000000 ;
Int Box [ 510 ] [1010 ];
Int Map [ 510 ] [ 510 ];
Int N, D;
Bool OK;
Int Count = 0 ;
Bool Solve ( Int A, Int B)
{
Int I, J;
Bool Flag = True ;
For (I = 1 ; I <= D; I ++)
{
If (Box [a] [I]> = Box [B] [I])
{
Flag = False ;
Break ;
}
}
Return Flag;
}
Void Init ()
{
Int I, J;
Memset (map, 0 , Sizeof (MAP ));
For (I = 2 ; I <= N; I ++)
{
If (Solve ( 1 , I ))
{
Map [ 1 ] [I] =1 ;
OK = True ;
}
}
For (I = 2 ; I <= N; I ++)
{
For (J = 2 ; J <= N; j ++)
{
If (Solve (I, j ))
{
Map [I] [J] = 1 ;
}
}
}
}
Int DP [ 510 ];
Int Main ()
{
Int I, J, K;
While (Scanf ( " % D " , & N, & D )! = EOF)
{
N ++;
OK =False ;
For (I = 1 ; I <= N; I ++)
{
For (J = 1 ; J <= D; j ++)
{
Scanf ( " % D " , & Box [I] [J]);
} Sort (Box [I] + 1 , Box [I] + 1 + D );
}
Init ();
If (! OK)
{
Printf ( " Please look for another gift shop! " );
Continue ;
}
DP [ 1 ] = 0 ;
For (I = 2 ; I <= N; I ++)
DP [I] =- 1 ;
For (I = 1 ; I <= N; I ++)
{
For (J = 1 ; J <= N; j ++)
{
If (Map [I] [J] & DP [I]! =- 1 )
{
If (DP [I] + 1 > DP [J])
{
DP [J] = DP [I] + 1 ;
}
}
}
}
Int Ans = 0 ;
For (I = 1 ; I <= N; I ++)
{
If (DP [I]> ans)
Ans = DP [I];
}
Printf (" % D \ n " , ANS );
}
Return 0 ;
}
DFS longest path
View code
# Include <stdio. h>
# Include < String . H>
# Include <algorithm>
Using Namespace STD;
Const Int INF = 100000000 ;
Int Box [ 510 ] [ 1010 ];
Int Map [ 510 ] [ 510 ];
Int N, D;
Bool OK;
Int Count = 0 ;
Bool Solve ( Int A, Int B)
{
Int I, J;
Bool Flag = True ;
For (I = 1 ; I <= D; I ++)
{
If (Box [a] [I]> = Box [B] [I])
{
Flag = False ;
Break ;
}
}
Return Flag;
}
Void Init ()
{
Int I, J;
Memset (map, 0 , Sizeof (MAP ));
For (I = 2 ; I <= N; I ++)
{
If (Solve ( 1 , I ))
{
Map [ 1 ] [I] = 1 ;
OK = True ;
}
}
For (I = 2 ; I <= N; I ++)
{
For (J = 2 ; J <= N; j ++)
{
If (Solve (I, j ))
{
Map [I] [J] = 1 ;
}
}
}
}
Int Ans;
Void DFS ( Int P, Int Max)
{
If (Max> ans) ans = max;
Int I;
For (I = 2 ; I <= N; I ++)
{
If (Map [p] [I])
{
Max ++;
DFS (I, max );
Max --;
}
}
}
Int Main ()
{
Int I, J, K;
While (Scanf ( " % D " , & N, & D )! = EOF)
{
N ++;
OK = False ;
For (I = 1 ; I <= N; I ++)
{
For (J = 1 ; J <= D; j ++)
{
Scanf ( " % D " , & Box [I] [J]);
} Sort (Box [I] + 1 , Box [I] + 1 + D );
}
Init ();
If (! OK)
{
Printf ( " Please look for another gift shop! " );
Continue ;
}
Ans = 0 ;
DFS ( 1 , 0 );
Printf ( " % D \ n " , ANS );
}
Return 0 ;
}