Sword Finger Offer Interview Question 47 : The Maximum Value of Gifts (Dynamic Programming)

이 질문은 값을 기록하기 위해 1 차원 배열을 사용하는 질문을했기 때문에 처음에는 다소 혼란 스럽습니다.이 질문이 앞쪽에서 뒤쪽으로 가장 큰 요소를 선택하여 경로에 추가하는 것이라면 다음 요소의 크기는 여전히 전체 크기에 영향을 미치며 결과를 보장 할 수 없습니다.

그러나 2 차원 배열을 사용하여 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];
        }
    }

최적화

이 방법은 1 차원 배열을 사용하는데, 배열이 하나씩 갱신되기 때문에 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