矩阵连乘动态规划算法
来源:互联网 发布:淘宝十大创意网店 编辑:程序博客网 时间:2024/05/17 22:33
矩阵连乘动态规划算法
题目描述:
Java实现:
import java.util.Scanner;public class MatrixChain { public static void main(String[] args) { // TODO 自动生成的方法存根 Scanner scan = new Scanner(System.in); int n = scan.nextInt(); int p[] = new int[n+1]; for(int i=0; i<=n; i++) p[i] = scan.nextInt();// int n = 6;// int p[] = {30, 35, 15, 5, 10, 20, 25}; //非递归 int m[][] = new int[n+1][n+1]; int s[][] = new int[n+1][n+1]; MatrixChain1(p, n, m, s); t(1, n, s); System.out.println(); String sss = traceBack(1, n, s); System.out.println(sss); //自底向上 递归 动态规划 int s1[][] = new int[n+1][n+1]; RecurMatrixChain(1, n, p, s1); t(1, n, s1); System.out.println(); //自顶向下 递归 动态规划 int m2[][] = new int[n+1][n+1]; int s2[][] = new int[n+1][n+1]; MemoizedMatrixChain(n, m2, s2, p); t(1, n, s2); } //输出计算最优计算次序,括号分离 public static void t(int i, int j, int s[][]) { if (i == j) System.out.print("A" + i); else { System.out.print("("); t(i, s[i][j], s); t(s[i][j]+1, j, s); System.out.print(")"); } } public static String traceBack(int i,int j,int s[][]){ if(i==j){ return "A"+i; } else{ return"("+traceBack(i,s[i][j],s)+traceBack(s[i][j]+1,j,s)+")"; } } //非递归方法 //一维数组P存储n个矩阵的行列值, 二维数组m存储最优值, 二维数组s记录最优断开位置 public static void MatrixChain1(int p[], int n, int m[][], int s[][]){ for(int i=1; i<=n; i++)//单个矩阵 m[i][i] = 0; for(int r=2; r<=n; r++){//多个矩阵 for(int len=1; len<=n-r+1; len++){ int j = len + r -1; m[len][j] = m[len+1][j] +p[len-1]*p[len]*p[j]; s[len][j] = len; for(int k=len+1; k<j; k++){ int t = m[len][k] + m[k+1][j] + p[len-1]*p[k]*p[j]; if(t < m[len][j]){ m[len][j] = t; s[len][j] = k; } } } } } //一维数组P存储n个矩阵的维数值, 二维数组s记录最优断开位置 //自底向上 递归 动态规划 public static int RecurMatrixChain(int i, int j, int p[], int s[][]) { if(i==j) return 0; int u = RecurMatrixChain(i, i, p, s) + RecurMatrixChain(i+1, j, p, s) + p[i-1]*p[i]*p[j]; s[i][j] = i; for(int k=i+1; k<j; k++){ int t = RecurMatrixChain(i, k, p, s) + RecurMatrixChain(k+1, j, p, s) + p[i-1]*p[k]*p[j]; if(t < u){ u = t; s[i][j] = k; } } return u; } //一维数组P存储n个矩阵的维数值, 二维数组m存储最优值, 二维数组s记录最优断开位置 //自顶向下 递归 动态规划(备忘录方法) public static int MemoizedMatrixChain(int n, int m[][], int s[][], int p[]) { for(int i=1; i<=n; i++) for(int j=i; j<=n; j++) m[i][j] = 0; return LookupChain(1, n, m, s, p); } public static int LookupChain(int i, int j, int m[][], int s[][], int p[]){ if(m[i][j] > 0) return m[i][j]; if(i==j) return 0; int u = LookupChain(i, i, m, s, p) + LookupChain(i+1, j, m, s, p) + p[i-1]*p[i]*p[j]; s[i][j] = i; for(int k=i+1; k<j; k++){ int t = LookupChain(i, k, m, s, p) + LookupChain(k+1, j, m, s, p) + p[i-1]*p[k]*p[j]; if(t < u){ u = t; s[i][j] = k; } } m[i][j] =u; return u; }}
阅读全文
0 0
- 算法[动态规划]-矩阵连乘问题
- 矩阵连乘--动态规划算法
- 矩阵连乘的动态规划算法
- 矩阵连乘动态规划算法
- 矩阵连乘 动态规划
- 矩阵连乘 动态规划
- 矩阵连乘-动态规划
- 动态规划-矩阵连乘
- 动态规划 - 矩阵连乘
- 矩阵连乘--动态规划
- 矩阵连乘--动态规划
- 矩阵连乘 (动态规划)
- 矩阵连乘,动态规划
- 矩阵连乘(动态规划)
- 矩阵连乘----动态规划
- 动态规划--矩阵连乘
- Java算法3--动态规划算法实现矩阵连乘
- 矩阵连乘问题的动态规划算法(java)
- java提高篇(五)-----使用序列化实现对象的拷贝
- html5 手机浏览器的分辨率
- Android之弹窗 PopupWindow简单使用详解
- Scoket通讯Demo
- 解决APP启动闪屏
- 矩阵连乘动态规划算法
- 英语单词词频统计
- 使用豆瓣音乐API笔记
- Java多线程学习笔记(一)——Java的非线程安全问题
- javanio中FileChannel写入文件write,追加文件,以及多文件合并
- 【Java】Java虚拟机
- PRISM 下载安装
- socket编程之bind()函数
- 通过JS判断打开PC或H5页面