动态规划------数塔问题
一 图
二 求解方法(迭代求解)
采用自下而上的求解方法,对第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();
}
}