矩阵连乘问题_动态规划

1)问题引导

从上面我们可以知道不同的结合方式,矩阵计算的次序数不一样,那么如何求这个最小次序数的划分,即如何结合。这就是矩阵连乘问题

使用动态规划可以解决

如下图,如果我们使用递归,则会产生大量的重复计算,复杂度太高,当然使用备忘录降低复杂度。不过更好的是使用递推

递推算法分析如下:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 void matrixChain(int n,int p[],int m[][100],int s[][100])//递推
 4 {
 5    for(int i=1;i<=n;i++){//对角线先为0
 6     m[i][i]=0;
 7    }
 8    for(int r=2;r<=n;r++){//一共n-1个对角线
 9     for(int i=1;i<=n-r+1;i++){//第i行
10         int j=i+r-1;//在该行的对角线上的点对应的j值
11         m[i][j]=m[i+1][j]+p[i-1]*p[i]*p[j];//初始化此时在i处取得最优解
12         s[i][j]=i;
13         for(int k=i+1;k<j;k++){//如果有更小的则被替换
14             int t=m[i][k]+m[k+1][j]+p[i-1]*p[k]*p[j];
15             if(t<m[i][j])
16             {
17                 m[i][j]=t;
18                 s[i][j]=k;
19             }
20         }
21     }
22    }
23 }
24 void print_optimal_parents(int s[100][100],int i,int j)//打印划分的结果
25  {
26      if( i == j)
27          cout<<"A"<<i;
28      else
29      {
30          cout<<"(";
31          print_optimal_parents(s,i,s[i][j]);
32          print_optimal_parents(s,s[i][j]+1,j);
33          cout<<")";
34      }
35
36  }
37 int main()
38 {
39     int p[1000];//每个矩阵的行数和最后一个的列数
40     int m[100][100];//存储最优子结构
41     int s[100][100];//存储当前结构的最优断点
42     memset(p,0,sizeof(p));
43     memset(m,0,sizeof(m));
44     memset(s,0,sizeof(s));
45     cout << "请输入矩阵的个数"<< endl;
46     int n;
47     cin >> n;
48     cout << "请依次输入每个矩阵的行数和最后一个矩阵的列数"<< endl;
49     for(int i=0;i<=n;i++){
50         cin >> p[i];
51     }
52     matrixChain(n,p,m,s);
53     cout <<"这些矩阵相乘的最少次数是"<<m[1][n]<<endl;
54
55      cout<<"结果是:"<<endl;
56      print_optimal_parents(s,1,n);
57     return 0;
58 }

原文地址:https://www.cnblogs.com/henuliulei/p/10074465.html

时间: 2024-10-20 00:33:57

矩阵连乘问题_动态规划的相关文章

Codevs_1166_[NOIP2007]_矩阵取数游戏_(动态规划+高精度)

描述 http://codevs.cn/problem/1166/ 分析 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <algorithm> 5 using namespace std; 6 7 const int maxn=50; 8 9 struct Bign{ 10 int x[maxn],cnt; 11 int & operator []

BZOJ_1009_[HNOI2008]_GT考试_(动态规划+kmp+矩阵乘法优化+快速幂)

描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1009 字符串全部由0~9组成,给出一个串s,求一个长度为n的串,不包含s的种类有多少. 分析 第一眼以为是组合.然后更滑稽的是用错误的方法手算样例居然算出来是对的...我数学是有多差... 题解也是看了好半天,有点难理解. 感觉PoPoQQQ神犇讲得还是比较清楚的.传送门:http://blog.csdn.net/popoqqq/article/details/40188173 我们用dp[

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

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

矩阵连乘问题(动态规划算法)

问题描述: 具体可参考:https://blog.csdn.net/liufeng_king/article/details/8497607 代码如下: #ifndef MATRIX_CHAIN_H #define MATRIX_CHAIN_H void matrix_chain(int *p, int n, int **m, int **s); void traceback(int i, int j, int **s); #endif #include <iostream> #include

最优二叉查找树_动态规划

原问题是给出各个节点和各个节点的被查找概率,然后构造一棵各个节点平均被查找比较次数最小的树,则该问题可以用动态规划来解决 示例如下 推广到一般的情况,并设T(i, j)是由记录{ri, …, rj}(1≤i≤j≤n)构成的二叉查找树,C(i, j)是这棵二叉查找树的平均比较次数,有下列分析 观察这个表,可知可知左边的表的第一行的第四列就是我们要求的最优平均比较次数,而右边的表我们可以知道在c(i ,j)得到最优解,即平均查找次数最小的根节点,比如一共四个节点,则我们从右边的R(1,4)的值即3是

BZOJ_3039_玉蟾宫_(动态规划+悬线法)

描述 http://www.lydsy.com/JudgeOnline/problem.php?id=3039 n*m的矩阵由R和F组成,求全是F的子矩阵的大小的三倍. 分析 悬线法: 浅谈用极大化思想解决最大子矩形问题--王知昆 l[x][y]表示点(x,y)在它那一行最多能扩展到左边的位置. r[x][y]表示点(x,y)在它那一行最多能扩展到右边的位置. 每一行分别预处理l与r. 在做dp的时候:如果点(x,y)可以取,那么h[x][y]=h[x-1][y]+1,l[x][y]=max(l

【动态规划】skiing_深度搜索_动态规划

问题 B: [动态规划]skiing 时间限制: 1 Sec  内存限制: 128 MB提交: 28  解决: 11[提交][状态][讨论版] 题目描述 Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道载一个 区域中最长底滑坡.区域由一个二维数组给出.数组的每个数字代表点的高度.下面是一个例子 1 2 3 4 5 16 17 18 19 6 15 24 25 20 7

算法导论_动态规划_最长公共子序列

一.动态规划的概念 动态规划(Dynamic Programming)是通过组合子问题的解而解决整个问题的.分治是指将问题划分成一些独立的子问题,递归地求解各子问题,然后合并子问题的解而得到原始问题的解,与此不同,动态规划适用于子问题不是独立的情况,也就是各个子问题包含公共的子问题.在这种情况下,采用分治法会做许多不必要的工作,即重复地求解公共地子问题.动态规划算法对每个子问题只求解一次,将其结果保存在一张表中,从而避免每次遇到各个子问题时重新计算答案. 动态规划通常应用于最优化问题.此类问题可

算法第一讲_动态规划

转自follow your hearthttp://www.cnblogs.com/kkgreen/archive/2011/06/26/2090702.html 转载:http://blog.csdn.net/woshioosm/article/details/7438834{思考动态规划的第一点----最优子结构思考动态规划的第二点----子问题重叠思考动态规划的第三点----边界思考动态规划的第四点----子问题独立思考动态规划的第五点----做备忘录思考动态规划的第六点----时间分析步