数字三角形-递归和动态规划
Posted nuist__NJUPT
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数字三角形-递归和动态规划相关的知识,希望对你有一定的参考价值。
数字三角形-递归和动态规划
输入:
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
输出:
30
方法1:递归,自顶向下,当前数字+max(左下路径,右下路径)
import java.util.Scanner;
public class NumberTriangle {
public static int max1(int [][] arr, int i, int j){
int rowIndex = arr.length ;
if(i == rowIndex - 1){
return arr[i][j] ;
}else{ //当前数字+max(左下路径,右下路径)
return arr[i][j] + Math.max(max1(arr,i+1, j), max1(arr, i+1, j+1)) ;
}
}
public static void main(String[] args) {
Scanner input = new Scanner(System.in) ;
int n = input.nextInt() ;
int [][] arr = new int [n][] ;
for(int i=0; i<n; i++){ //为二维数组分配空间
arr[i] = new int[i+1] ;
}
for(int i=0; i<n; i++){
for(int j=0; j<i+1; j++){
arr[i][j] = input.nextInt() ;
}
}
System.out.println(max1(arr,0,0)) ;
}
}
方法2:动态规划(二维数组),自底向上,先更新最后一行的dp数组,从倒数第2行依次向上走,该位置dp数组值=该位置原数组值+max(左下dp,右下dp)
import java.util.Scanner;
public class NumberTriangle {
public static void dynamic(int [][] triangle){ //自底向上的构造思路
int row = triangle.length ;
int column = triangle[row-1].length ;
int [][] dp = new int [row][column] ;
for(int k=0; k<column; k++){ //初始化最后一行
dp[row-1][k] = triangle[row-1][k] ;
}
//从倒数第二行开始,依次向上走
for(int k=column-2; k>=0; k--){
for(int l=0; l<=k; l++){ //该位置dp数组值=该位置原数组值+max(左下dp,右下dp)
dp[k][l] = triangle[k][l] + Math.max(dp[k+1][l], dp[k+1][l+1]) ;
}
}
System.out.println(dp[0][0]) ;
}
public static void main(String[] args) {
Scanner input = new Scanner(System.in) ;
int n = input.nextInt() ;
int [][] triangle = new int [n][] ;
for(int i=0; i<n; i++){
triangle[i] = new int [i+1] ;
}
for(int i=0; i<n; i++){
for(int j=0; j<i+1; j++){
triangle[i][j] = input.nextInt() ;
}
}
dynamic(triangle) ;
}
}
方法3:动态规划(一维数组):利用滚动数组,节约存储空间。
import java.util.Scanner;
public class NumberTriangle1 {
public static void dynamic(int [][] triangle){
int row = triangle.length ;
int column = triangle[row-1].length ;
int [] dp = new int [column] ;
for(int i=0; i<column; i++){
dp[i] = triangle[row-1][i] ;
}
for(int i=row-2; i>=0; i--){
for(int j=0; j<=i; j++){
dp[j] = triangle[i][j] + Math.max(dp[j+1], dp[j]) ;
}
}
System.out.println(dp[0]) ;
}
public static void main(String[] args) {
Scanner input = new Scanner(System.in) ;
int n = input.nextInt() ;
int [][] triangle = new int [n][] ;
for(int i=0; i<n; i++){
triangle[i] = new int [i+1] ;
}
for(int i=0; i<n; i++){
for(int j=0; j<i+1; j++){
triangle[i][j] = input.nextInt() ;
}
}
dynamic(triangle) ;
}
}
以上是关于数字三角形-递归和动态规划的主要内容,如果未能解决你的问题,请参考以下文章