제목 설명:
선물은 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));
}
}