matrix_chain_order

to calculate the min step of multiplicate some matixs

 1 package dynamic_programming;
 2
 3 public class matrix_chain_order { //input is a sequence p = p0,p1..pn,where p.length = n+1  (matrix n is pn-1pn)
 4     int[] p;
 5     int[][] cost;
 6      public matrix_chain_order(int[] a){
 7          p = a;
 8      }
 9      public int order(){
10         int q = 0;
11         int n = p.length -1;
12         cost = new int[n][n];
13         for(int i = 0;i<= n-1;i++){
14             cost[i][i] = 0;
15         }
16         for(int l = 2;l<n;l++){  //the chain length,like merge sort
17             for(int i=0;i<n-l;i++){
18                 int j = i+l -1;
19                 cost[i][j] =Integer.MAX_VALUE;
20                 for(int k = i;k <=j -1;k++){
21                     q = cost[i][k] + cost[k+1][j] + p[i-1]*p[k]*p[j];
22                     if(q < cost[i][j]){
23                         cost[i][j] = q; //remeber the best step of i to j
24                     }
25                 }
26             }
27         }
28         return cost[n-1][n-1];
29      }
30
31
32 }
时间: 2024-12-29 09:51:02

matrix_chain_order的相关文章

算法13---动态规划矩阵链乘法

算法13---动态规划矩阵链乘法 矩阵链乘法是动态规划里面使用到的一个例子 1 两个矩阵的计算 那么对于一个矩阵的乘法,首先如果是两个矩阵的乘法,那么如何实现呢? 注意到我们使用二维数组表示矩阵,但是二维数组不能作为函数的返回值.具体实现如下 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <math.h> 4 5 #define a_rows 3 6 #define a_columns 4 7 #define

动态规划-矩阵链乘法

问题描述: 给定由n个要相乘的矩阵构成的序列(链)<A1,A2,...,An>,要计算乘积A1A2...An,可以将两个矩阵相乘的标准算法作为一个子程序,通过加括号确定计算的顺序(对同一矩阵链,不同的计算顺序所需要的计算次数大不相同). 目标问题:给定n个矩阵构成的矩阵链<A1,A2,...,An>,其中,i=1,2,...,n,矩阵Ai的维数为pi-1×pi,对乘积A1A2...An以一种最小计算次数加全部括号. 穷尽搜索: 令P(n)表示一串n个矩阵可能的加全部方案数.当n=1

算法导论_第十六章_动态规划_creatshare分享会

动态规划 注:该篇为本人原创,转载请注明出处:http://blog.csdn.net/chudongfang2015/article/details/51590817--开心 -.- 个人对动态规划的理解: 1.动态规划是一个付出额外空间来节省时间,就是所谓的空间换时间. 2.动态规划储存每个状态的最优解. 3.动态规划是用来把子问题的结果储存下来,再次用到的时候就不必再进行重复计算. 算法导论对动态规划的解释: 动态规划和分治方法相似,都是通过组合子问题的解来求解原问题,分治方法将问题划分为

Algorithm --&gt; 矩阵链乘法

动态规划--矩阵链乘法 1.矩阵乘法 Note:只有当矩阵A的列数与矩阵B的行数相等时A×B才有意义.一个m×r的矩阵A左乘一个r×n的矩阵B,会得到一个m×n的矩阵C. #include <iostream> using namespace std; #define A_ROWS 3 #define A_COLUMNS 2 #define B_ROWS 2 #define B_COLUMNS 3 void matrix_multiply(int A[A_ROWS][A_COLUMNS],in

[转]常见的动态规划问题分析与求解

动态规划(Dynamic Programming,简称DP),虽然抽象后进行求解的思路并不复杂,但具体的形式千差万别,找出问题的子结构以及通过子结构重新构造最优解的过程很难统一,并不像回溯法具有解决绝大多数问题的银弹(全面解析回溯法:算法框架与问题求解).为了解决动态规划问题,只能靠多练习.多思考了.本文主要是对一些常见的动态规划题目的收集,希望能有所帮助.难度评级受个人主观影响较大,仅供参考. 目录(点击跳转) 动态规划求解的一般思路 备忘录法 1.硬币找零 扩展1:单路取苹果 扩展2:装配线

矩阵链相乘实例

题目描述 零崎有很多朋友,其中有一个叫jhljx. jhljx大家很熟悉了,他数学不好也是出了名的,大家都懂. 现在jhljx遇到了矩阵乘法,他当时就懵了.数都数不清的他,矩阵乘法怎么可能会算的清楚呢?虽然零崎觉得还不如让你们来算,不过好歹也要给jhljx个面子,给她留下一个证明自己数学实力的机会.为了减小jhljx的计算量,让他赶快算出不正确答案来(估计他算上几遍都不一定能出一个正确答案),零崎请你们帮助jhljx. 输入 多组输入数据. 每组数据以N开始,表示矩阵链的长度.接下来一行N+1个

算法导论------------------动态规划之矩阵链问题

[问题描述] 给定有n个连乘矩阵的维数,要求计算其采用最优计算次序时所用的乘法次数,即所要求计算的乘法次数最少.例如,给定三个连乘矩阵{A1,A2,A3}的维数分别是10*100,100*5和5*50,采用(A1A2)A3,乘法次数为10*100*5+10*5*50=7500次,而采用A1(A2A3),乘法次数为100*5*50+10*100*50=75000次乘法,显然,最好的次序是(A1A2)A3,乘法次数为7500次. 分析: 矩阵链乘法问题描述: 给定由n个矩阵构成的序列[A1,A2,.

矩阵链乘最优化实现

矩阵链乘最优化算法(括号化算法),关键要找到A[i]...A[j]矩阵链相乘做最少乘法次数(存在m[][]中)的相乘顺序,记录在矩阵s[][]中.再利用递归定义矩阵链乘算法.递归的出口是只有一个矩阵(直接返回)或者两个矩阵(返回相乘后的结果矩阵)的情况. 1 //#include"OptimalMatrixMultiplication.h" 2 #include<iostream.h> 3 #include<stdio.h> 4 #include<stdl

算法导论——lec 11 动态规划及应用

和分治法一样,动态规划也是通过组合子问题的解而解决整个问题的.分治法是指将问题划分为一个一个独立的子问题,递归地求解各个子问题然后合并子问题的解而得到原问题的解.与此不同,动态规划适用于子问题不是相互独立的情况,即各个子问题包含公共的子子问题.在这种情况下,如果用分治法会多做许多不必要的工作,重复求解相同的子子问题.而动态规划将每个子问题的解求解的结果放在一张表中,避免了重复求解. 一. 动态规划介绍 1. 动态规划方法介绍: 动态规划主要应用于最优化问题, 而这些问题通常有很多可行解,而我们希