using
System;
using
System.Linq;
class
GFG {
static
void
Sort(
int
[][] array,
int
columnNumber)
{
Array.Sort(array, (first, second) = > {
if
(columnNumber >= 1
&& first[columnNumber - 1]
> second[columnNumber - 1]) {
return
1;
}
else
{
return
-1;
}
});
}
static
int
findLongest(
int
[][] a,
int
n,
int
present,
int
previous,
int
[][] dp,
int
N)
{
if
(present == n) {
return
0;
}
else
if
(previous != -1) {
if
(dp[present][previous] != -1)
return
dp[present][previous];
}
int
ans = 0;
if
(previous == -1) {
ans = 1
+ findLongest(a, n, present + 1, present,
dp, N);
ans = Math.Max(ans,
findLongest(a, n, present + 1,
previous, dp, N));
}
else
{
int
h1 = a[previous][0];
int
h2 = a[present][0];
int
w1 = a[previous][1];
int
w2 = a[present][1];
if
((h1 <= h2 && w1 <= w2)) {
ans = Math.Max(
ans, findLongest(a, n, present + 1,
previous, dp, N));
}
else
{
ans = 1
+ findLongest(a, n, present + 1,
present, dp, N);
ans = Math.Max(
ans, findLongest(a, n, present + 1,
previous, dp, N));
}
}
if
(present >= 0 && previous >= 0) {
return
dp[present][previous] = ans;
}
return
ans;
}
static
int
getLongest(
int
[][] a,
int
n)
{
int
N = 10;
int
[][] dp =
new
int
[N + 1][];
for
(
int
i = 0; i <= N; i++)
dp[i] = Enumerable.Repeat(-1, N + 1).ToArray();
Sort(a, 0);
int
ans = findLongest(a, n, 0, -1, dp, N);
return
ans;
}
public
static
void
Main(
string
[] args)
{
int
[][] a =
new
int
[4][];
a[0] =
new
int
[] { 1, 5 };
a[1] =
new
int
[] { 2, 4 };
a[2] =
new
int
[] { 1, 1 };
a[3] =
new
int
[] { 3, 3 };
int
n = a.Length;
Console.WriteLine(getLongest(a, n));
}
}