数字三角形路径最小值c语言题目,算法学习——动态规划之点数值三角形的最小路径...

算法描述在一个n行的点数值三角形中,寻找从顶点开始每一步可沿着左斜或者右斜向下直到到达底端,使得每个点上的数值之和为最小

右图为一个4行的点数值三角形

AAffA0nNPuCLAAAAAElFTkSuQmCC

算法思路接收用户输入行数n

使用一个二维数组a[n+1][n+1]来存放各个点上的数值,数值可以由用户输入或者是随机生成

定义一个二维数组(用来存放方向)direction[n+1][n+1],存放1或0,1代表右,0代表左

定义一个二维数组b[n+1][n+1] 表示到底端的数值之和

以上图4行的点数值三角形为例

b[4][1]=47 b[4][2]=93

b[3][1]=43

这里b[3][1]是可以等于47,也可以等于93,但题目要求的是最小,所以这里取小的值

b[3][1]其实是由逆推得到的,具体看下面

b[n+1][n+1]的递推关系初始值

从最后一行开始

b[n][i]=a[n][i] i遍历完最后一行的所有元素

递推关系

b[n][i]=Math.min(b[n+1][i],b[n+1][i+1]) 取最小值

算法实现System.out.println("输入数字三角形的行数n:");

Scanner scanner = new  Scanner(System.in);    int n = scanner.nextInt();

scanner.close();    int[][] a= new int[n+1][n+1];    //随机赋值数字三角形

for(int i=1;i

a[i][j] = (int) (Math.random()*100);

}

}    //输出数字三角形

for(int i=1;i

System.out.print(a[i][j]+"    ");

}

System.out.println("");

}    int[][] b = new int[n+1][n+1];    int[][] direction = new int[n+1][n+1];//0是左,1是右

//最后一行的长度为其本身

for(int i=1;i

b[n][i] = a[n][i];

}    //关键逆推代码

for(int i=n-1;i>=1;i--){        for(int j=1;j<=i;j++){            if(b[i+1][j+1]

b[i][j]=a[i][j] + b[i+1][j+1];

direction[i][j]=1;//右边的数值较大,则记录方向为右

}else{

b[i][j]=a[i][j] + b[i+1][j];

direction[i][j]=0;//左边的数值较大,则记录方向为左

}

}

}

System.out.println("最小路径和为"+b[1][1]);    int flag = 1;    int j=1;    //循坏结束

while(flag!=n){

System.out.print(a[flag][j]);        if(direction[flag][j]==1){

System.out.print("->向右");

flag++;

j++;

}else{

System.out.print("->向左");

flag++;

}

}

System.out.print("->"+a[flag][j]);

}

结果

AAffA0nNPuCLAAAAAElFTkSuQmCC

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值