DP——最优矩阵链乘最优三角剖分
最优矩阵链乘:
一个n*m的矩阵乘一个m*p的矩阵等于一个n*p的矩阵,运算量为mnp,现在有一组n个矩阵组成的序列,求运算量的最小值。
这是DP中的最优矩阵链乘问题,我们可以这么理解:用一个d[i][j]来存储第i个矩阵链乘到第j个矩阵的最优解,那么现在进行DP化,也就是找它的子解。我们把这组序列从中间不同位置裂开,记这个位置为k,那么不难得到d[i][j]=d[i][k]+d[k+1][j]+p[i-1]*p[k]*p[j],根据最优化原则,如果d[i][k]和d[k+1][j]都已经是最优解,那么我们只要取k为某值时d[i][j]为最小即可。
可以写出状态转移方程:d[i][j] = min(d[i][j], d[i][k] + d[k + 1][j] + p[i - 1] * p[k] * p[j]),但要注意,这里如果用递推,i和j都是很难取的,因为这按i和j的区间递推的,所以我们按照j-i递增的顺序递推,长区间的值依赖与小区间的值。边界条件是d[i][i]=0。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<algorithm>
using namespace std;
int n;
int d[105][105],p[105];int main()
{int i, j,k,l;while (~scanf("%d", &n)){for (i = 1; i <= n; i++)scanf("%d%d", &p[i - 1], &p[i]);for (i = 1; i <= n; i++)d[i][i] = 0;for (l = 2; l <= n; l++)//按照j-i也就是区间的长度来递推{for (i = 1; i <= n - l + 1; i++){j = i + l - 1;d[i][j] = 0xfffffff;for (k = i; k <= j - 1; k++)d[i][j] = min(d[i][j], d[i][k] + d[k + 1][j] + p[i - 1] * p[k] * p[j]);}}printf("%d\n", d[1][n]);}return 0;
}
最优三角剖分:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int n = 6;
int w[][n] = { { 0,2,2,3,1,4 },{ 2,0,1,5,2,3 },{ 2,1,0,2,1,4 },{ 3,5,2,0,6,2 },{ 1,2,1,6,0,1 },{ 4,3,4,2,1,0 } };
int d[10][10];int get_weight(int a, int b, int c)
{return (w[a][b] + w[a][c] + w[b][c]);
}int main()
{int i, j, l, k;for (i = 0; i <= n; i++)//边界条件{d[i][i] = 0;d[i][i + 1] = 0;}for (l = 2; l < n; l++){for (i = 0; i + l <= n-1; i++){j = i + l;d[i][j] = 0xffffff;for (k = i + 1; k < j; k++)d[i][j] = min(d[i][j], d[i][k] + d[k][j] + get_weight(i, k, j));}}printf("%d\n", d[0][n - 1]);return 0;
}
转载于:https://www.cnblogs.com/seasonal/p/10343738.html
DP——最优矩阵链乘最优三角剖分相关推荐
- 【动态规划】区间DP - 最优矩阵链乘(另附POJ1651Multiplication Puzzle)
最优矩阵链乘(动态规划) 一个n∗mn*mn∗m的矩阵由 nnn 行 mmm 列共 n∗mn*mn∗m 排列而成.两个矩阵A和B可以相乘当且仅当A的列数等于B的行数.一个nm的矩阵乘mp的矩阵,运算量 ...
- 【算法分析与设计】矩阵链乘法最优顺序问题
矩阵链乘法 矩阵连乘,选择不同的乘法顺序,效率可能千差万别. 高效的实现算法应该用动态规划来设计,具体的讲解可以看这里. 编程实现 public class Main {private static ...
- 【动态规划】矩阵链乘法
矩阵链乘法 求解矩阵链相乘问题时动态规划算法的另一个例子.给定一个n个矩阵的序列(矩阵链)<A1,A2,...,An>,我们希望计算它们的乘积 A1A2...An 为了计算表 ...
- python矩阵乘法算法_Python算法|矩阵链乘法
概述 矩阵乘法是一个满足结合律的运算.显然,对于矩阵A.B.C来说,(AB)C 与 A(BC) 是等价的,我们可以根据自己的心情选择任意的运算顺序,总之,结果都是一样的. 糟糕的是,对计算机来说可不是 ...
- 矩阵连乘 最优计算次序 动态规划 图文详解
矩阵连乘最优次序求解 没有公式,放心食用. 问题概要 给定矩阵 A1 A2 A3 A4 A5 A6 及其行列维度 求解这些矩阵的最优计算次序,使得乘法运算次数最少 其中 A1 A2 A3 A4 A5 ...
- 【动态规划】矩阵链相乘 (ssl 1596)/能量项链 (ssl 2006)
矩阵链相乘{\color{Cyan} 矩阵链相乘 }矩阵链相乘 Description Input n表示矩阵的个数(<=100) n+1个数,表示矩阵(<=100) Output 最小的 ...
- 矩阵相乘的strassen算法_矩阵乘法的Strassen算法+动态规划算法(矩阵链相乘和硬币问题)...
矩阵乘法的Strassen 这个算法就是在矩阵乘法中采用分治法,能够有效的提高算法的效率. 先来看看咱们在高等代数中学的普通矩阵的乘法 两个矩阵相乘 上边这种普通求解方法的复杂度为: O(n3) 也称 ...
- 以空间换时间——动态规划算法及其应用:矩阵链相乘
动态规划算法是5大算法基础中最重要的一个,它专门用来解决平面世界下的应用,即会多次使用二维数组. 当然动态规划算法是空间换时间的算法,也就是说:我们可以利用空间资源来使某算法问题的时间复杂度降到最低. ...
- 矩阵链乘法问题 (算法)
一.概述 以两个矩阵相乘为例,A1*A2,A1和A2为两个矩阵,假设A1的行列数是p*q,A2的行列数是q*r.注意这里由于是A1乘以A2,所以A1的列数要等于A2的行数,否则无法做矩阵乘法,满足上述 ...
最新文章
- PHP的单引号双引号
- ajax获取网页新闻,基于Ajax的新闻网页动态数据的抓取方法及系统
- 如何处理Angular项目在Visual Studio Code打开报关于@Decorators的警告信息
- Ui设计中的动画如何应用,你知道吗?
- DDD-上下文映射图
- 【Redis】redis数据类型及应用场景
- termux安装python2_termux怎么安装python
- 华为Linux笔记本拆机,华为MateBook D怎么拆机?华为MateBook D拆机图文步骤详解
- 代码大全 服装尺寸图html,最全服装尺码对照表
- zuul+ribbon实现负载均衡
- Codeforces Round #531 F. Elongated Matrix (状压dp)
- 论文笔记:SubRank: Subgraph Embeddings via a Subgraph Proximity Measure2020PAKDD
- 南昌大学计算机导师林振荣,南昌大学各学院研究生导师介绍
- Maya10个非常实用的操作技巧,让你轻松玩转Maya
- 服务式办公室,价格影响选择
- uva10306(dp)
- 彻底搞懂a++和++a的区别
- 给GIS初学者的建议
- 去BAT,你应该要看一看的面试经验总结(转)
- 爬虫练习3 爬取堆糖网校花照片