Этот вопрос сначала сбивает с толку, потому что я только что задал вопрос, в котором для записи значения используется одномерный массив. Если этот вопрос заключается в том, чтобы выбрать самый большой элемент спереди назад и добавить его к пути, тогда размер следующего элемента все равно будет влиять на общий размер. Результат не может быть гарантирован.
Однако, если двумерный массив используется для записи максимального значения пути от i до j, а значение узла i, j равно максимальному значению максимального значения верхнего и левого путей, следовательно, начиная с левого верхнего угла, вы можете получить максимальное значение всех путей,
Верните значение в правом нижнем углу и все.
В этом вопросе результат получается, спереди назад, снизу вверх, как в предыдущем вопросе, нет, потому что формула повторения этого вопроса не i = i [count + 1] + ... Поиск текущему элементу не нужно заранее знать последующие элементы
Мой код
int[][] p = null;
public int maxValue(int[][] grid) {
p = new int[grid.length][grid[0].length];
for(int count_1 = 0; count_1<p.length ;count_1++){
for(int count_2 = 0; count_2<p[0].length ;count_2++){
p[count_1][count_2] = 0;
}
}
int i = 0;
int j = 0;
while(i<p.length&&j<p[0].length){
for(int count_2 = j;count_2<p[0].length;count_2++){
findMax(grid,i,count_2);
}
for(int count_1 = i;count_1<p.length;count_1++){
findMax(grid,count_1,j);
}
i++;
j++;
}
return p[p.length-1][p[0].length-1];
}
public void findMax(int[][] grid,int i,int j){
if(i==0&&j==0){
p[i][j] = grid[i][j];
}else if(i==0){
p[i][j] = p[i][j-1] + grid[i][j];
}else if(j==0){
p[i][j] = p[i-1][j] + grid[i][j];
}else{
p[i][j] = p[i][j-1] > p[i-1][j]? p[i][j-1] + grid[i][j]:p[i-1][j] + grid[i][j];
}
}
Оптимизация
В этом методе используется одномерный массив.Поскольку массив обновляется один за другим, значение текущей строки, которая была обновлена до j, является значением предыдущей строки, которая не обновлялась после j и j.
int[] max_val = new int[p[0].length];
public int maxValue(int[][] grid) {
p = new int[grid.length][grid[0].length];
for(int count_1 = 0; count_1<p.length ;count_1++){
for(int count_2 = 0; count_2<p[0].length ;count_2++){
p[count_1][count_2] = 0;
}
}
int i = 0;
int j = 0;
for(int count_1 = i;count_1<p.length;count_1++){
for(int count_2 = j;count_2<p[0].length;count_2++){
findMax(grid,i,count_2);
}
}
i++;
j++;
}
return p[p.length-1][p[0].length-1];
}
public void findMax(int[][] grid,int i,int j){
if(i==0&&j==0){
max_val[j] = grid[i][j];
}else if(i==0){
max_val[j] = max_val[j-1] + grid[i][j];
}else if(j==0){
max_val[j] = max_val[j] + grid[i][j];
}else{
max_val[j] = max_val[j] > max_val[j-1]? max_val[j] + grid[i][j]:max_val[j-1] + grid[i][j];
}
}