动态规划------数塔问题(迭代实现)

						动态规划------数塔问题

一 图
在这里插入图片描述
二 求解方法(迭代求解)
采用自下而上的求解方法,对第4层,下有两条路径,选取其中最长的作为第五层到第四层的路径

递推方程 dp[i][j]=max(dp[i+1][j],dp[i+1][j+1])+f[i][j]
解释:f[i][j]指的是i,j对应的方块的值
dp[4][1]=max(19,7)+2

三 Java实现代码
import java.util.Scanner;

public class NumberTower {
private int a[][]=new int[6][6];//预分配原数组
private int dp[][]=new int[a.length][a.length];//算法数组
private int path[][]=new int[a.length-1][a.length-1];//路径
public void Init(int n)
{
System.out.println(“请输入数塔的层数”);
Scanner scanner=new Scanner(System.in);
int length=scanner.nextInt();
a=new int[length][length];
for(int i=0;i<a.length;i++)
{
for(int j=0;j<a.length;j++)
{
a[i][j]=0;
}
}

}
public void Input()
{
    System.out.println("请输入数塔的数字:");
    Scanner scanner=new Scanner(System.in);
    for(int i=1;i<a.length;i++)
    {
     System.out.print("第"+i+"层:"+"(请输入"+i+"个数)");
        for(int j=1;j<=i;j++)
        {
            a[i][j]=scanner.nextInt();
        }
    }

}
public void Solution()
{

    for(int i=1;i<a.length;i++)//对dp数组进行第n行的数的初始化
    {
        dp[a.length-1][i]=a[a.length-1][i];
    }
    for(int k=a.length-2;k>=0;k--)//从第n-1行开始计算dp数组的每个值
    {
        for(int m=k;m>=0;m--)
        {
            if(dp[k+1][m]>=dp[k+1][m+1])//下一层的左边大于下一层的右边
            {
                dp[k][m]=dp[k+1][m]+a[k][m];
                path[k][m]=1;//左表示1.右表示2
            }
            else
            {
                dp[k][m]=dp[k+1][m+1]+a[k][m];
                path[k][m]=2;
            }
            dp[k][m]=Math.max(dp[k+1][m],dp[k+1][m+1])+a[k][m];
        }
    }

    System.out.println("最长路径为的长度为:"+dp[1][1]);
}
public void Path()
{
    System.out.print("最长路径为:"+a[1][1]+" ");
    int j=1;//用于下一层的列值
    for(int i=1;i<path.length;i++)
    {

        if(path[i][j]==1)
        {
            System.out.print(a[i+1][j]+" ");
            /*j=j;*/
        }
        else if(path[i][j]==2)
        {
            System.out.print(a[i+1][j+1]+" ");
            j=j+1;
        }
    }
}
public static void main (String[] args) {
 NumberTower numberTower=new NumberTower();
 numberTower.Init(6);
 numberTower.Input();
 numberTower.Solution();
 numberTower.Path();
}

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值