이 질문은 값을 기록하기 위해 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];
}
}