1 礼物的最大值
1.1 方法1
public static int getMaxValue(int[][] data) {
if (data == null) {
return -1;
}
int row = data.length;
int col = data[0].length;
int[][] states = new int[row][col];
states[0][0] = data[0][0];
for (int i = 1; i < col; i++) {
int pre = states[0][i - 1];
states[0][i] = pre + data[0][i];
}
for (int i = 1; i < row; i++) {
int pre = states[i - 1][0];
states[i][0] = pre + data[i][0];
}
for (int i = 1; i < row; i++) {
for (int j = 1; j < col; j++) {
states[i][j] = Math.max(states[i - 1][j], states[i][j - 1]) + data[i][j];
}
}
return states[row - 1][col - 1];
}
public static void main(String[] args) {
int[][] data =
{
{1, 10, 3, 8},
{12, 2, 9, 6},
{5, 7, 4, 11},
{3, 7, 16, 5}
};
int res = getMaxValue(data);
System.out.println(res);
}
1.2 方法2
public static int getMaxValue_2(int[][] data) {
if (data == null) {
return -1;
}
int row = data.length;
int col = data[0].length;
int[][] states = new int[2][col];
boolean flag = true;
states[0][0] = data[0][0];
states[1][0] = states[0][0] + data[0][0];
for (int i = 1; i < col; i++) {
states[0][i] = states[0][i - 1] + data[0][i];
}
int m = 1;
while (true) {
if (flag) {
if (m == row) {
break;
}
for (int i = 0; i < col; i++) {
if (i == 0) {
states[1][0] = states[0][0] + data[m][0];
} else {
states[1][i] = Math.max(states[0][i], states[1][i - 1]) + data[m][i];
}
}
++m;
flag = false;
}
if (!flag) {
if (m == row) {
break;
}
for (int i = 0; i < col; i++) {
if (i == 0) {
states[0][0] = states[1][0] + data[m][0];
} else {
states[0][i] = Math.max(states[0][i - 1], states[1][i]) + data[m][i];
}
}
++m;
flag = true;
}
}
return Math.max(states[0][col - 1], states[1][col - 1]);
}