基于DP的矩阵连乘问题
当多个连续可乘矩阵做乘法时,选择正确的做乘顺序可以有效减少做乘法的次数,而选择的方法可以很容易的通过DP实现。
原理就是对于每一个所求矩阵,搜索所有可以相乘得到它的方法,比较它们的消耗,选取最小值作为采用的方法。
例如,给出矩阵A1(30*35) A2(35*15) A3(15*5) A4(5*10) A5(10*20) A6(20*25)
我们另m(i,j)表示从第i个矩阵乘到第j个矩阵,并用p[i]表示矩阵的边长,如p[0]=30,p[1]=35......
于是我们有:
若i==j m(i,j)=0
若i<j m(i,j)=min(m(i,k)+m(k+1,j)+p[i-1]*p[k]*p[j]),k=i,i+1,i+2...j-1(i<=k<j)
实际操作过程中,我们往往用数组来记录每一个我们已经计算过的m(i,j)来提高效率。
代码如下:
主算法:
#pragma once
#include <algorithm>
int matrix_p[MAX_V];
int m[MAX_V][MAX_V];
int matrix_V; int matrix_mul(int i, int j)
{
if (m[i][j] == INF)
{
for (int k = i;k < j;++k)
{
m[i][j] = std::min(m[i][j], matrix_mul(i, k) + matrix_mul(k + , j) + matrix_p[i - ] * matrix_p[k] * matrix_p[j]);
}
}
return m[i][j];
}
主程序:
void matrix_chain_test()
{
cin >> matrix_V;
for (int i = ;i <= matrix_V;++i) cin >> matrix_p[i];
for (int i = ;i <= matrix_V;++i)
{
for (int j = ;j <= matrix_V;++j)
{
m[i][j] = INF;
}
m[i][i] = ;
}
int i, j;
while (true)
{
cin >> i >> j;
if (i == -) break;
cout << matrix_mul(i, j) << endl;
}
}
PS:INF和MAX_V是两个很大的数,具体大家自己定就行。
基于DP的矩阵连乘问题的更多相关文章
- 【loj2325】「清华集训 2017」小Y和恐怖的奴隶主  概率dp+倍增+矩阵乘法
		
题目描述 你有一个m点生命值的奴隶主,奴隶主受伤未死且当前随从数目不超过k则再召唤一个m点生命值的奴隶主. T次询问,每次询问如果如果对面下出一个n点攻击力的克苏恩,你的英雄期望会受到到多少伤害. 输 ...
 - 基于DP+位运算的RMQ算法
		
来源:http://blog.csdn.net/y990041769/article/details/38405063 RMQ算法,是一个快速求区间最值的离线算法,预处理时间复杂度O(n*log(n) ...
 - poj 3744 Scout YYF I(概率dp,矩阵优化)
		
Scout YYF I Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 5020 Accepted: 1355 Descr ...
 - 基于OpenMP的矩阵乘法实现及效率提升分析
		
一. 矩阵乘法串行实现 例子选择两个1024*1024的矩阵相乘,根据矩阵乘法运算得到运算结果.其中,两个矩阵中的数为double类型,初值由随机数函数产生.代码如下: #include <i ...
 - 基于MapReduce的矩阵乘法运算
		
1.采用两个MapReduce运算串联来实现 Pik= Mij*Njk 第一步: Map函数:将每个矩阵运算mij传给键值对(j,(M,i,mij)),将每个矩阵元素njk传给键值对(j,(N,k,n ...
 - DP之矩阵连乘问题
		
最优二叉查找树的一道思考习题 同最优二叉查找树一样,矩阵连乘问题也是一个卡特兰数问题(其动态规划的构造过程都很像) 分析解答: a,铺垫的数学知识首先要搞清楚矩阵相乘是怎么乘的: 1)对于连续的n个矩 ...
 - bzoj 1009 [HNOI2008]GT考试(DP+KMP+矩阵乘法)
		
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1009 [题意] 给定一个字符串T,问长度为n且不包含串T的字符串有多少种. [思路] ...
 - 【POJ2778】DNA Sequence 【AC自动机,dp,矩阵快速幂】
		
题意 题目给出m(m<=10)个仅仅由A,T,C,G组成的单词(单词长度不超过10),然后给出一个整数n(n<=2000000000),问你用这四个字母组成一个长度为n的长文本,有多少种组 ...
 - 2018.09.27 bzoj2510: 弱题(概率dp+循环矩阵优化)
		
传送门 简单概率dp. 显然每次转移的式子可以用一个矩阵表示出来: 这个是循环矩阵. 因此只用维护第一行快速幂一波就行了. 代码: #include<bits/stdc++.h> #def ...
 
随机推荐
- java文件的基本操作示例
			
一.获得控制台用户输入的信息 public String getInputMessage() throws IOException...{ System.out.println("请输入您的 ...
 - 数据结构基础(3)  --Permutation & 插入排序
			
Permutation(排列组合) 排列问题: 设R = {r1, r2, ... , rn}是要进行排列的n个元素, Ri = R-{ri}; 集合X中元素的全排列记为Permutation(X), ...
 - 《java入门第一季》之类小案例(模拟用户登录)
			
首先是做一个用户登录的小案例.在此基础上加入其它逻辑. import java.util.Scanner; /* * 模拟登录,给三次机会,并提示还有几次.如果登录成功,就可以玩猜数字小游戏了. * ...
 - Unity3D学习笔记(四)Unity的网络基础(C#)
			
一 网络下载可以使用WWW类下载资源用法:以下载图片为例WWW date = new WWW("<url>");yield return date;texture = ...
 - Java-ServletInputStream
			
import java.io.InputStream; import java.io.IOException; /** * Provides an input stream for reading b ...
 - PS图层混合算法之四(亮光, 点光, 线性光, 实色混合)
			
亮光模式: 根据绘图色通过增加或降低"对比度",加深或减淡颜色.如果绘图色比50%的灰亮,图像通过降低对比度被照亮,如果绘图色比50%的灰暗,图像通过增加对比度变暗. 线性光模式: ...
 - Android NDK开发三:java和C\C++交互
			
转自:http://www.cnblogs.com/shangdahao/archive/2013/05/02/3053971.html 1.定义native方法并加载动态链接库: public cl ...
 - android 自定义gallerey并实现预览功能
			
自从Gallery被谷歌废弃以后,Google推荐使用ViewPager和HorizontalScrollView来实现Gallery的效果.的确HorizontalScrollView可以实现Gal ...
 - Junit指定测试执行顺序
			
原文链接: Test execution order原文日期: 2012年12月06日翻译日期: 2014年7月2日翻译人员: 铁锚说明: Junit4.11版本及以后才支持,建议升级到最新版本.按照 ...
 - TCP连接建立系列 — 服务端接收SYN段
			
本文主要分析:服务器端接收到SYN包时的处理路径. 内核版本:3.6 Author:zhangskd @ csdn blog 接收入口 1. 状态为ESTABLISHED时,用tcp_rcv_esta ...