[신인 훈련] 검은 오퍼 47을 의미합니다. 선물의 최대 가치 (기본 dp)

제목 설명:

선물은 m * n 체스 판의 각 사각형에 배치되며 각 선물에는 특정 값 (0보다 큰 값)이 있습니다. 보드 의 왼쪽 상단 모서리 에서 시작 하여 그리드에서 선물 받고 , 보드의 오른쪽 하단 모서리에 도달 할 때까지 한 번에 한 칸씩 오른쪽 또는 아래쪽으로 이동할 수 있습니다 . 체스 판의 가치와 그 위에있는 선물을 감안할 때받을 수있는 선물의 최대 가치를 계산하세요?

예 1 :
입력 :
[
[1,3,1],
[1,5,1],
[4,2,1]
]
출력 : 12
설명 : 경로 1 → 3 → 5 → 2 → 1 이 최대 값을 얻을 수 있음 선물


축소 : 0 <grid.length <= 200
0 <grid [0] .length <= 200

출처 : LeetCode (LeetCode)
링크 : https://leetcode-cn.com/problems/li-wu-de-zui-da-jie-zhi-lcof
저작권은 LeetCode 가 소유합니다. 상업적 재판의 경우 공식 승인에 문의하고 비상업적 재판의 경우 출처를 표시하십시오.

문제 해결 아이디어 :

가장 기본적인 dp 문제는 제목에 따른 전달 방정식 만 알아 내면됩니다.
제목은 오른쪽으로 하나의 사각형 만 필요 하거나 아래쪽으로 하나만 필요하기 때문에 전달 방정식을 유도하는 것이 어렵지 않습니다.

dp [i] [j] = max (dp [i-1] [j] + 그리드 [i] [j], dp [i] [j-1] + 그리드 [i] [j]) i> 0 && j> 0

i = 0 일 때 첫 번째 행에서 dp 값은 오른쪽으로 이동해야만 얻을 수 있으므로 dp [i] [j] = dp [i] [j-1] + grid [i] [ j] i == 0 && j> 0

j = 0 인 경우 첫 번째 열에서 dp 값은 아래로 이동해야만 얻을 수 있으므로 dp [i] [j] = dp [i-1] [j] + grid [i] [j] i> 0 & j == 0

시작점은 왼쪽 상단 모서리입니다. 즉, i == 0 && j == 0 일 때 dp [i] [j] = grid [i] [j]

따라서 다음과 같은 자세한 전달 방정식을 얻습니다.
① 시작점 : i == 0 && j == 0 dp [0] [0] = grid [0] [0]

② 첫 번째 줄 : i == 0 && j> 0 dp [i] [j] = dp [i] [j-1] + grid [i] [j]는 오른쪽으로 이동해야만 도달 할 수 있습니다.

③ 첫 번째 열 : i> 0 && j == 0 dp [i] [j] = dp [i-1] [j] + 격자 [i] [j]는 아래로만 이동할 수 있습니다.

④ 일반 상황 : i> 0 && j> 0 dp [i] [j] = max (dp [i-1] [j] + grid [i] [j], dp [i] [j-1] + grid [i] [j]) 오른쪽과 아래로 이동하면 도달 할 수 있습니다.

참고 :이 문제는 DFS를 사용하여 해결할 수도 있습니다.

암호:

public class jianzhi_Offer_47 {
    
    
    public int maxValue(int[][] grid){
    
    
        if (grid.length == 0){
    
    
            return 0;
        }
        int[][] dp = new int[grid.length][grid[0].length];
        dp[0][0] = grid[0][0];
        for(int i = 0; i < grid.length; i++){
    
    
            for (int j = 0; j < grid[i].length; j++){
    
    
                if(i == 0 && j > 0){
    
    
                    dp[i][j] = dp[i][j-1] + grid[i][j];
                }
                else if(j == 0 && i > 0){
    
    
                    dp[i][j] = dp[i - 1][j] + grid[i][j];
                }
                else if(i > 0 && j > 0) {
    
    
                    dp[i][j] = Math.max(dp[i - 1][j] + grid[i][j], dp[i][j - 1] + grid[i][j]);
                }
            }
        }
        return dp[grid.length - 1][grid[0].length - 1];

    }

    public static void main(String[] args) {
    
    
        jianzhi_Offer_47 obj = new jianzhi_Offer_47();
        int[][] grid = new int[][]{
    
    
                {
    
    1,2,3,4,5},{
    
    1,3,5,2,3},{
    
    3,1,2,5,4},{
    
    4,3,3,5,4}
        };
        System.out.println(obj.maxValue(grid));
    }
}

추천

출처blog.csdn.net/Puppet__/article/details/115249354