蓝桥 数字三角形 Java 动态规划

上图给出了一个数字三角形。从三角形的顶部到底部有很多条不同的路径。对于每条路径,把路径上面的数加起来可以得到一个和,你的任务就是找到最大的和。

路径上的每一步只能从一个数走到下一层和它最近的左边的那个数或者右 边的那个数。此外,向左下走的次数与向右下走的次数相差不能超过 1。

定义一个n+1行n+1列的数组arr

int[][] arr = new int[n+1][n+1];

从第一行第一列开始;

arr[i][j] = Math.max(arr[i-1][j-1],arr[i-1][j]);

 

 

因为向左下走的次数与向右下走的次数相差不能超过 1。

想要次数相差不超过一,只能是中间的数。那么n如果是奇数的话就是arr[n][n/2+1],如果n为偶数的话则为Math.max(arr[n][n/2],arr[n][n/2 +1])。

import java.util.Scanner;

public class Main{
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int[][] arr = new int[n+1][n+1];
        for(int i = 1;i<=n;i++){
            for(int j =1;j<=i;j++){
                arr[i][j] = scanner.nextInt();
                arr[i][j] += Math.max(arr[i-1][j], arr[i-1][j-1]);
            }
        }
        if(n%2 == 1){
            System.out.println(arr[n][n/2 +1]);
        }else{
            System.out.println(Math.max(arr[n][n/2],arr[n][n/2+1]));
        }
    }

}

posted @ 2022-12-16 10:25  limyu  阅读(17)  评论(0)    收藏  举报  来源