동적 계획 알고리즘 의 수 탑 문제
2909 단어 알고리즘
수 탑 꼭대기 층 에서 출발 하여 모든 결점 은 왼쪽으로 가 거나 오른쪽으로 가 는 것 을 선택 할 수 있 으 며 탑 밑 까지 걸 어가 서 걸 어 가 는 경로 의 수치 와 최대 치 를 요구 할 수 있다.
위의 그림 에서 보 듯 이 수 탑 은 최대 경로 와 86 이 고 지나 가 는 경 로 는 탑 꼭대기 에서 탑 밑 까지 13, 8, 26, 15, 24 이다.
문제 분석
동적 계획 함수:
resultTower[i][j] = tower[i][j] + Math.max(tower[i + 1][j],tower[i + 1][j + 1]);
경계 값 resultTower [heigh - 1] [j] = tower [heigh - 1] [j];
3. 알고리즘 코드
public int dataTower(int tower[][]){
int heigh = tower.length;//
int len = tower[heigh - 1].length;//
int [][] resultTower = new int[heigh][len];// ,
int [][] path = new int[heigh][len];//
//
for(int i = 0; i < len; i++){
resultTower[heigh - 1][i] = tower[heigh - 1][i];
}
//
for(int i = heigh - 2; i >= 0; i--){
for(int j = 0; j <= i; j++){
if(resultTower[i + 1][j] > resultTower[i + 1][j + 1]){
resultTower[i][j] = tower[i][j] + resultTower[i + 1][j];
path[i][j] = j;
}else{
resultTower[i][j] = tower[i][j] + resultTower[i + 1][j + 1];
path[i][j] = j + 1;
}
}
}
//
System.out.println(" " + resultTower[0][0] + "
:");
System.out.println(" 0 :" + tower[0][0]);
int j = path[0][0];
for(int i = 1; i <= heigh - 1; i++){
System.out.println(" " + i + " :" + tower[i][j]);
j = path[i][j];
}
System.out.println();
return resultTower[0][0];
}
4. 전체 테스트 코드
public class Solution {
public static void main(String [] args){
int [][] tower = {{13},{11,8},{12,7,26},{6,14,15,8},{12,7,13,24,11}};
int result = dataTower(tower);
}
public static int dataTower(int tower[][]){
int heigh = tower.length;//
int len = tower[heigh - 1].length;//
int [][] resultTower = new int[heigh][len];// ,
int [][] path = new int[heigh][len];//
//
for(int i = 0; i < len; i++){
resultTower[heigh - 1][i] = tower[heigh - 1][i];
}
//
for(int i = heigh - 2; i >= 0; i--){
for(int j = 0; j <= i; j++){
if(resultTower[i + 1][j] > resultTower[i + 1][j + 1]){
resultTower[i][j] = tower[i][j] + resultTower[i + 1][j];
path[i][j] = j;
}else{
resultTower[i][j] = tower[i][j] + resultTower[i + 1][j + 1];
path[i][j] = j + 1;
}
}
}
//
System.out.println(" " + resultTower[0][0] + "
:");
System.out.println(" 0 :" + tower[0][0]);
int j = path[0][0];
for(int i = 1; i <= heigh - 1; i++){
System.out.println(" " + i + " :" + tower[i][j]);
j = path[i][j];
}
System.out.println();
return resultTower[0][0];
}
}
운행 결과
86
:
0 :13
1 :8
2 :26
3 :15
4 :24
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
【Codility Lesson3】FrogJmpA small frog wants to get to the other side of the road. The frog is currently located at position X and wants to get to...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.