动态规划
来源
动态规划经典练习——最短路径
package yhj;
import java.util.Scanner;
public class Test {
static int qipan[][] = new int[5][5];//输入
static int temp[][] = new int[5][5]; //用来存放的最短路径的
public static void main(String[] args) {
Scanner scn = new Scanner(System.in);
for(int i=0;i<5;i++) {
for(int j=0;j<=i;j++) {
qipan[i][j] = scn.nextInt();
temp[i][j] = qipan[i][j];//初始化
}
}
dp(qipan,4);//把棋盘的第5层开始求。第5层最短路是本身,数组下标是4
//输出棋盘
for(int i=0;i<5;i++) {
for(int j=0;j<=i;j++) {
System.out.printf("%-4d",temp[i][j]);
}
System.out.println();
}
//输出路径,这部分代码只是用来输出路径的,调用print路径
temp[0][0] = -1;//用-1标记路径
print(temp,0);
for(int i=0;i<5;i++) {
for(int j=0;j<=i;j++) {//打印-1的点,不为-1则打印0
if(temp[i][j] ==-1) {
System.out.printf("%-4d",qipan[i][j]);
}else {
System.out.printf("%-4d",0);
}
}
System.out.println();
}
}
//标记最短路径(递归)(顺序往后)
private static void print(int[][] temp, int k) {
if( k==4 ) {
return;
}
for(int i=0;i<=k;i++) {
if(temp[k][i]==-1) {//从顶点开始
if(temp[k+1][i]<temp[k+1][i+1]) {//注意:找到下一层与目标点连接的两个点中的较小值,标记为-1
temp[k+1][i] = -1;
}else {
temp[k+1][i+1] = -1;
}
}
}
print(temp, k+1);
}
//核心代码(递归)(从最后逆序往前)
private static void dp(int[][] qipan, int k) {
if(k ==0) {
return;
}
for(int j=0;j<k;j++) {
temp[k-1][j] = temp[k-1][j] + Math.min(temp[k][j], temp[k][j+1]);//转移方程
}
dp(qipan, k-1);
}
}
结果:
temp:
17
10 14
14 7 6
6 9 6 9
4 5 2 6 5
路径打印:
7
3 0
0 1 0
0 0 4 0
0 0 2 0 0