import
java.util.Arrays;
import
java.util.Vector;
class
Main {
public
static
int
maximumPointsUtil(
int
index,
int
[] dp, Vector<Vector<Integer> > points)
{
if
(dp[index] != -
1
)
return
dp[index];
int
row = index /
3
;
int
col = index %
3
;
if
(col ==
0
) {
dp[index] = points.get(row).get(col)
+ Math.max(maximumPointsUtil(index +
4
, dp, points), maximumPointsUtil(index +
5
, dp, points));
return
dp[index];
}
else
if
(col ==
1
) {
dp[index] = points.get(row).get(col)
+ Math.max(maximumPointsUtil(index +
2
, dp, points), maximumPointsUtil(index +
4
, dp, points));
return
dp[index];
}
else
{
dp[index] = points.get(row).get(col)
+ Math.max(maximumPointsUtil(index +
1
, dp, points), maximumPointsUtil(index +
2
, dp, points));
return
dp[index];
}
}
public
static
int
maximumPoints(Vector<Vector<Integer> > points,
int
n)
{
int
[] dp =
new
int
[n *
3
];
Arrays.fill(dp, -
1
);
dp[n *
3
-
1
] = points.get(n -
1
).get(
2
);
dp[n *
3
-
2
] = points.get(n -
1
).get(
1
);
dp[n *
3
-
3
] = points.get(n -
1
).get(
0
);
int
first = maximumPointsUtil(
0
, dp, points);
int
second = maximumPointsUtil(
1
, dp, points);
int
third = maximumPointsUtil(
2
, dp, points);
return
Math.max(first, Math.max(second, third));
}
public
static
void
main(String[] args)
{
Vector<Vector<Integer> > points =
new
Vector<>();
points.add(
new
Vector<>(Arrays.asList(
1
,
2
,
5
)));
points.add(
new
Vector<>(Arrays.asList(
3
,
1
,
1
)));
points.add(
new
Vector<>(Arrays.asList(
3
,
3
,
3
)));
int
n = points.size();
System.out.println(maximumPoints(points, n));
}
}