Вопрос 47 на собеседовании с предложением Sword Finger: Максимальная ценность подарков (динамическое программирование)

Этот вопрос сначала сбивает с толку, потому что я только что задал вопрос, в котором для записи значения используется одномерный массив. Если этот вопрос заключается в том, чтобы выбрать самый большой элемент спереди назад и добавить его к пути, тогда размер следующего элемента все равно будет влиять на общий размер. Результат не может быть гарантирован.

Однако, если двумерный массив используется для записи максимального значения пути от 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];
        }
    }

 

 

рекомендация

отblog.csdn.net/qq_40473204/article/details/114579872
рекомендация