public class Four {
static int N = 100;
static int[] v = {1,2,3,4,5,6,7,8,7,10};
static int[][] maxValue = new int[N][N];
static int[][] select = new int[N][N];
public static void main(String[]args){
maxValue(v,10);
}
static int maxValue(int[]v,int n){
int i, j, len;
for(i = 0; i < n; i++){
maxValue[i][i] = v[i];
select[i][i] = i;
}
for(i = 0; i < n - 1; i++){
if(v[i] > v[i + 1]){
maxValue[i][i + 1] = v[i];
select[i][i + 1] = i;
}
else{
maxValue[i][i + 1] = v[i + 1];
select[i][i + 1] = i + 1;
}
}
for(len = 3; len <= n; len++){
for(i = 0; i < n - len + 1; i++){
j = i + len - 1;
int first = 0, last = 0;
if(select[i + 1][j] == j)
first = v[i] + maxValue[i + 1][j - 1];
else if(select[i + 1][j] == i + 1)
first = v[i] + maxValue[i + 2][j];
if(select[i][j - 1] == i)
last = maxValue[i + 1][j - 1] + v[j];
else if(select[i][j - 1] == j - 1)
last = maxValue[i][j - 2] + v[j];
if(first > last){
maxValue[i][j] = first;
select[i][j] = i;
}
else{
maxValue[i][j] = last;
select[i][j] = j;
}
}
}
return maxValue[0][n - 1];
}
}
static int N = 100;
static int[] v = {1,2,3,4,5,6,7,8,7,10};
static int[][] maxValue = new int[N][N];
static int[][] select = new int[N][N];
public static void main(String[]args){
maxValue(v,10);
}
static int maxValue(int[]v,int n){
int i, j, len;
for(i = 0; i < n; i++){
maxValue[i][i] = v[i];
select[i][i] = i;
}
for(i = 0; i < n - 1; i++){
if(v[i] > v[i + 1]){
maxValue[i][i + 1] = v[i];
select[i][i + 1] = i;
}
else{
maxValue[i][i + 1] = v[i + 1];
select[i][i + 1] = i + 1;
}
}
for(len = 3; len <= n; len++){
for(i = 0; i < n - len + 1; i++){
j = i + len - 1;
int first = 0, last = 0;
if(select[i + 1][j] == j)
first = v[i] + maxValue[i + 1][j - 1];
else if(select[i + 1][j] == i + 1)
first = v[i] + maxValue[i + 2][j];
if(select[i][j - 1] == i)
last = maxValue[i + 1][j - 1] + v[j];
else if(select[i][j - 1] == j - 1)
last = maxValue[i][j - 2] + v[j];
if(first > last){
maxValue[i][j] = first;
select[i][j] = i;
}
else{
maxValue[i][j] = last;
select[i][j] = j;
}
}
}
return maxValue[0][n - 1];
}
}