动态规划&矩阵连乘
动态规划&矩阵连乘
动态规划的概念
• 与分治方法类似
分-治-合
• 与分治方法不同
子问题之间并非相互独立
• 基本思想
用一个表记录所有子问题的解,不管子问题是否被用到,只要它被计算过,就将其结果备份至表中
动态规划的基本要素
• 最优子结构
利用问题的最优子结构性质,以自底向上的方式递归地从子问题的最优解逐步构造出整个问题的最优解。最优子结构是问题能用动态规划算法求解的前提。
• 重叠子问题
• 递归算法求解问题时,每次产生的子问题并不总是新问题,有些子问题被反复计算多次。这种性质称为子问题的重叠性质。
• 动态规划算法,对每一个子问题只解一次,而后将其解保存在一个表格中,当再次需要解此子问题时,只是简单地用常数时间查看一下结果。
• 通常不同的子问题个数随问题的大小呈多项式增长。因此用动态规划算法只需要多项式时间,从而获得较高的解题效率。
动态规划的步骤
• 找出最优解的性质
• 递归地定义最优值
• 以自底向上的方式计算出最优值
• 根据计算获得的最优值,构造最优解
矩阵连乘
• 问题
给定n个矩阵(A1,A2,…,An),其中Ai和Ai+1是可乘的,求解这n个矩阵的连乘积A?
• 矩阵连乘积A=A1A2A3A4
• 计算次序
(((A1A2)A3)A4))
((A1(A2A3))A4)
(A1((A2A3)A4))
(A1(A2(A3A4)))
((A1A2)(A3A4))
• 最优子结构性质
原问题的最优解包含其子问题的最优解
A[1:n]的最优计算次序所包含的计算矩阵子链A[1:k]和A[k+1:n]也是最优的
数学归纳法可以证明
• 建立递归关系
令A[i:j]所需的最少数乘次数为m[i][j].
当i=j时,m[i][j]=0
当i<j时,m[i][j]=m[i][k]+m[k+1][j] +pi-1*pk*pj
构造递归关系
将对应的m[i][j]的断开位置k记为s[i][j],可递归的构造最优解
• 递归求解
int matrixChainRecur(int i, int j){
if (i == j) return ;
int u = matrixChainRecur(i, i) + matrixChainRecur(i+, j)
+ p[i-] * p[i] * p[j];
s[i][j] = i;
for (int k = i + ; k < j; k++) {
int t = matrixChainRecur(i, k) + matrixChainRecur(k+, j)
+ p[i-] * p[k] * p[j];
if (t < u){
u = t;
s[i][j] = k;
}
}
return u;
}
• 在递归计算时,许多子问题被重复计算多次。这也是该问题可用动态规划算法求解的又一显著特征。
• 用动态规划算法解此问题,可依据其递归式以自底向上的方式进行计算。在计算过程中,保存已解决的子问题答案。每个子问题只计算一次,而在后面需要时只要简单查一下,从而避免大量的重复计算,最终得到多项式时间的算法
• 计算最优值
A1 |
A2 |
A3 |
A4 |
A5 |
A6 |
30´35 |
35´15 |
15´5 |
5´10 |
10´20 |
20´25 |
# include<stdio.h>
# include<iostream>
using namespace std; int m[][],s[][],n,p[];
void matrixChain()
{
int i,j,k,r;
for(i=; i<=n; i++) m[i][i]=;
for(r=; r<=n; r++) //对角线
for( i=; i<=n-r+; i++) //行
{
j = r+i-; //列
m[i][j]=m[i][i]+m[i+][j]+p[i-]*p[i]*p[j];
s[i][j]=i;
for(k = i+; k<j; k++)
{
int temp=m[i][k]+m[k+][j]+p[i-]*p[k]*p[j];
if(temp<m[i][j])
{
m[i][j]=temp;
s[i][j]=k;
}
}
}
} void traceback(int i,int j)
{
if(i==j)return ;
traceback(i,s[i][j]);
traceback(s[i][j]+,j);
cout<<"Multiply A"<<i<<","<<s[i][j]<<"and A"<<s[i][j]+<<","<<j<<endl;
} int main()
{
cin>>n;
for(int i=; i<=n; i++)
cin>>p[i];
//测试数据可以设为六个矩阵分别为
//A1[30*35],A2[35*15],A3[15*5],A4[5*10],A5[10*20],A6[20*25]
//则p[0-6]={30,35,15,5,10,20,25}
//输入:30 35 15 5 10 20 25
matrixChain();
traceback(,n);
//最终解值为m[1][n];
cout<<m[][n]<<endl;
return ;
}
动态规划&矩阵连乘的更多相关文章
- BZOJ_3270_博物馆_(高斯消元+期望动态规划+矩阵)
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=3270 \(n\)个房间,刚开始两个人分别在\(a,b\),每分钟在第\(i\)个房间有\(p[ ...
- poj 3744 Scout (Another) YYF I - 概率与期望 - 动态规划 - 矩阵快速幂
(Another) YYF is a couragous scout. Now he is on a dangerous mission which is to penetrate into th ...
- (基于Java)算法之动态规划——矩阵连乘问题
动态规划(Dynamic Programming):与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解.与分治法不同的是,适用于动态规划法求解 ...
- hdu 2604 Queuing(动态规划—>矩阵快速幂,更通用的模版)
题目 最早不会写,看了网上的分析,然后终于想明白了矩阵是怎么出来的了,哈哈哈哈. 因为边上的项目排列顺序不一样,所以写出来的矩阵形式也可能不一样,但是都是可以的 //愚钝的我不会写这题,然后百度了,照 ...
- 51nod动态规划-----矩阵取数
一个N*N矩阵中有不同的正整数,经过这个格子,就能获得相应价值的奖励,从左上走到右下,只能向下向右走,求能够获得的最大价值. 例如:3 * 3的方格. 1 3 3 2 1 3 2 2 1 能够获得的最 ...
- Educational Codeforces Round 60 (Rated for Div. 2) - D. Magic Gems(动态规划+矩阵快速幂)
Problem Educational Codeforces Round 60 (Rated for Div. 2) - D. Magic Gems Time Limit: 3000 mSec P ...
- BZOJ2553 Beijing2011禁忌(AC自动机+动态规划+矩阵快速幂+概率期望)
考虑对一个串如何分割能取得最大值.那么这是一个经典的线段覆盖问题,显然每次取右端点尽量靠前的串.于是可以把串放在AC自动机上跑,找到一个合法串后就记录并跳到根. 然后考虑dp.设f[i][j]表示前i ...
- 【题解】 bzoj1875: [SDOI2009]HH去散步 (动态规划+矩阵乘法)
bzoj1875,懒得复制,戳我戳我 Solution: 看到这道题,看的出是个dp,每个点\(t\)时刻到达的方案数等于\(t-1\)到连过来的点方案数之和 但又因为题目有要求不能走一样的边回去不是 ...
- BZOJ5298 CQOI2018交错序列(动态规划+矩阵快速幂)
显然答案为Σkb·(n-k)a·C(n-k+1,k).并且可以发现ΣC(n-k,k)=fibn.但这实际上没有任何卵用. 纯组合看起来不太行得通,换个思路,考虑一个显然的dp,即设f[i][j][0/ ...
随机推荐
- bss 概念
BSS段 在采用段式内存管理的架构中,BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域.BSS是英文Block Started by Symbol的简称.BSS ...
- 【Java基础】Java中的持久属性集Properties
Properties 类的介绍 Properties 类表示了一个持久的属性集.Properties 可保存在流中或从流中加载.属性列表中每个键及其对应值都是一个字符串.一个属性列表可包含另一个属性列 ...
- Cassandra的登录认证授权
cassandra的登录验证机制是独自的,数据是集群共享的 参考:http://blog.csdn.net/y_y_y_k_k_k_k/article/category/5943357 1.初始安装启 ...
- java使用xheditor Ajax异步上传错误
java使用xheditor Ajax异步上传时候错误如下:the request doesn't contain a multipart/form-data or multipart/mixed s ...
- CenOS搭建FTP服务器
CenOS搭建FTP服务器 -------------------------------------------------------------------------准备工作--------- ...
- Spring mvc Data Redis—Pub/Sub(附Web项目源码)
一.发布和订阅机制 当一个客户端通过 PUBLISH 命令向订阅者发送信息的时候,我们称这个客户端为发布者(publisher). 而当一个客户端使用 SUBSCRIBE 或者 PSUBSCRIBE ...
- 浅谈C语言中的联合体
联合体union 当多个数据须要共享内存或者多个数据每次仅仅取其一时.能够利用联合体(union).在C Programming Language 一书中对于联合体是这么描写叙述的: 1)联合体是一个 ...
- ss与 netstat
ss快的秘诀在于,它利用到了TCP协议栈中tcp_diag.tcp_diag是一个用于分析统计的模块, 可以获得Linux 内核中第一手的信息,这就确保了ss的快捷高效.当然,如果你的系统中没有tcp ...
- UIStackView 看我就够了
介绍 UIStackView 是 iOS9新增的一个布局技术.熟练掌握相当节省布局时间. UIStackView 是 UIView 的子类,是用来约束子控件的一个控件.但他的作用仅限于此,他不能用来呈 ...
- 使用TabLayout快速实现一个导航栏
在没有Material Design的年代,要实现一个类似微信主页面的效果,我们有以下几种解决方案: 1.Fragment + ViewPager + RadioGroup自定义固定导航条 2.F ...