算法之动态规划-->>数塔问题

本文介绍了使用动态规划解决数塔问题的思路和方法。从底层开始,通过比较每个节点的两个子节点来构建最大路径。存储结构采用下三角矩阵,并使用数组记录每一步的最大值。动态规划规划函数涉及递推关系,程序代码实现了解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数塔问题:从数塔顶层出发,每一个数字可以向左或者向右走,一直走到最底层,要求找出一条路径,使得路径上的数值和最大。如下图:


解决思路如下:

  1. 利用动态规划自底向上的方法从最底层开始比较。比较方法如第四层为:2+max(4,5)、7+max(5,2)、4+max(2,6)、4+max(6,5)
  2. 存储结构为下三角的矩阵,用数组array来存储。并用一个数组max来存储每一步规划的最大值
  3. 规划函数为:

max[ n-1 ][ j ]=array[ n-1 ][ j ] ( 0<=j<=n-1 )  

max[ i ][ j ]=array[ i ][ j ]+max{ max[ i+1 ][ j ],max[ i+1 ][ j+1 ] } ( 0<=i<=n-2 ,0<=j<=i) 

程序代码如下:

import java.util.Scanner;
public class Main{

	public static void main(String[] args) {
		int n;
		Scanner in=new Scanner(System.in);
		n=in.nextInt();
		int[][] array=new int[n][n];
		for(int i=0;i<n;i++){
			for(int j=0;j<=i;j++){
				array[i][j]=in.nextInt();
			}
		}
		int max=f(array);
		System.out.println(max);
	}
	public static int f(int[][] array){
		int[][] max=array;
		int n=max.length;
		for(int i=n-2;i>=0;i--){
			for(int j=0;j<=i;j++){
				if(max[i+1][j]>max[i+1][j+1]){
					max[i][j]=array[i][j]+max[i+1][j];
				}
				else{
					max[i][j]=array[i][j]+max[i+1][j+1];
				}
			}
		}
		return max[0][0];
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值