动态规划:矩阵连乘问题
Posted Abro.
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态规划:矩阵连乘问题相关的知识,希望对你有一定的参考价值。
前言
动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题.
一、概念
1.1 算法总体思想
1.2 基本步骤
二、案例
2.1 例题
设有四个矩阵A,B,C,D,它们的维数分别是A=2×4 B=4×3 C=3×5,D=5×2,使用动态规划法求其最优解和最优加括号方法。
2.2 代码实现
源代码:
public class Matrix_2 {
/**
* 主方法 程序入口
* @param args
*/
public static void main(String[] args) {
int []p = {5,10,20,15,5};
int [][]m = new int [p.length+1][p.length+1];
int [][]s = new int [p.length+1][p.length+1];
MatrixChain(p,m,s);
System.out.println("乘法的最优次序:");
traceback(s,1,p.length-1);
}
/**
* 矩阵连乘
* @param p
* @param m
* @param s
*/
public static void MatrixChain(int []p,int [][]m,int [][]s){
for(int i=1;i<=p.length;i++){//矩阵对角线元素为0
m[i][i]=0;
}
for(int r = 2; r<= p.length;r++){
for(int i=1;i<=p.length-r;i++){
int j = i+r-1;
m[i][j] = m[i+1][j]+p[i-1]*p[i]*p[j];
s[i][j] = i;
for(int k =i+1;k<j;k++){
int t = m[i][k]+m[k+1][j]+p[i-1]*p[k]*p[j];
if(t<m[i][j]){
m[i][j] = t;
s[i][j]=k;
}
}
}
}
}
/**
* 加括号
* @param s
* @param i
* @param j
*/
private static void traceback(int[][] s, int i, int j) {
if(i==j)
System.out.print("A"+i);
else if(i+1==j)
System.out.print(" (A"+i+" * "+" A"+j+") ");
else{
System.out.print(" (");
traceback(s,i,s[i][j]);
traceback(s,s[i][j]+1,j);
System.out.print(") ");
}
}
}
运行结果:
总结
动态规划算法适用于解最优化问题,通常按以下几个步骤设计动态规划算法:
- 找出最优解的性质,并刻画其结构特征;
- 递归地定义最优值;
- 以自底向上的方式计算出最优值;
- 根据计算最优值时得到的信息构造最优解。
冲冲冲鸭O(∩_∩)O哈哈~
以上是关于动态规划:矩阵连乘问题的主要内容,如果未能解决你的问题,请参考以下文章