1. 算法思想
动态规划的实质是分治思想和解决冗余,因此,动态规划是一种将问题实例分解为更小的、相似的子问题,并存储子问题的解而避免计算重复的子问题,以解决最优化问题的算法策略。
2. 问题描述
已知图G(V,E)的距离矩阵如下,求其任意两点间的最短距离。-1表示两点之间不可达。
-1,1,2,-1,-1,-1
-1,-1,1,3,-1,7
-1,-1,-1,1,2,-1
-1,-1,-1,-1,-1,3
-1,-1,-1,-1,-1,6
-1,-1,-1,-1,-1,-1
3. 程序清单
/**图中任意两点间的最短距离问题
* DynamicProgramming.java
*/
package DynamicProgramming;
public class DynamicProgramming {
public void AllPaths(int matrix[][]){
int A[][]= new int[matrix.length][matrix.length];
int n=matrix.length;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
A[i][j]=matrix[i][j]; //将matrix[i][j]复制到A[i][j]
for(int k=0;k<n;k++) //对最高下标为k的结点的路径
for(int i=0;i<n;i++) //对于所有可能的结点对
for(int j=0;j<n;j++)
//if(A[i][j]!=-1 && A[i][k]!=-1 && A[k][j]!=-1)
if(A[i][k]!=-1 && A[k][j]!=-1)
{ if(A[i][j]!=-1)
A[i][j] = min(A[i][j],A[i][k]+A[k][j]);
else
A[i][j] = A[i][k]+A[k][j];
}
//输出任意两点间的最短距离
System.out.println("任意两点间的最短距离的矩阵表示为:");
for(int i=0;i<n;i++){
for(int j=0;j<n;j++)
System.out.print(A[i][j]+" ");
System.out.println();
}
}
public int min(int a,int b){
int result;
result = a;
if(b<a)
result = b;
return result;
}
public static void main(String[] args){
int cost[][] ={{-1,1,2,-1,-1,-1},{-1,-1,1,3,-1,7},{-1,-1,-1,1,2,-1}, {-1,-1,-1,-1,-1,3},{-1,-1,-1,-1,-1,6},{-1,-1,-1,-1,-1,-1}}; //定义二维数组,-1表示不可到达
DynamicProgramming instance = new DynamicProgramming();
instance.AllPaths(cost);
}
}
运行结果:
从结点1到结点3的最短距离是:15
从结点1到结点2的最短距离是:19
从结点1到结点6的最短距离是:25
从结点1到结点5的最短距离是:29
从结点1到结点4的最短距离是:29