31-矩阵相乘

                     2.矩阵连乘最少计算量 (10分)

                  C时间限制:3000 毫秒 |  C内存限制:3000 Kb

题目内容:

 n个矩阵A1,A2,...,An, ,如果其维度分别为d0xd1, d1xd2, ...dn-1xdn,则可以进行连乘运算A1A2A3..An .
连乘运算可以采取不同的顺序进行,如(A1A2)A3 和 A1(A2A3),这两种顺序的消耗乘法计算量是不同的,前者是
d0.d1.d2+d0.d2.d3,后者d0.d1.d3+d1.d2.d3.

第1步选择哪两个,第2步又选择哪两个,一直到最后算出结果需要做n-1次决定。其中有一种计算顺序使得
A1A2A3..An总的乘法计算量最小。

输入描述

第一行输入n
第二行输入维度向量d0,d1,...dn

输出描述

输出所需的最少乘法次数。

输入样例

4
2 3 2 4 3

输出样例

48思路: 区间dp, 设dp[i][j]表示第i个矩阵到第j个矩阵之间合并的最少相乘次数则递归方程为: dp[i][j] = min(dp[i][j], dp[i][k] + dp[k + 1][j] + d[i-1]*d[k]*d[j]); i < k < j;需要知道相邻矩阵的乘法规则:A1(x1, y1)* A2(x2, y2) = x1 * y1 * y2;(x表示行,y表示列)
#include <iostream>
using namespace std;
int dp[100][100];
int a[100];
int n;

int fun(int i, int j){
	if(i == j)
		return dp[i][j];
	if(i == j - 1)
		return dp[i][j] = a[i - 1] * a[i] * a[j];
	if(i < j - 1){
		dp[i][j] = 10000000;
		for(int k = i + 1; k < j; k++)
			dp[i][j] = min(dp[i][j], fun(i, k) + fun(k + 1, j) + a[i - 1] * a[j] * a[k]);
	}
	return dp[i][j];
}

int main(){
	cin >> n;

	for(int i = 0; i <= n; i++)
		cin >> a[i];
	cout << fun(1, n);

	return 0;
}
时间: 2024-10-31 03:48:10

31-矩阵相乘的相关文章

使用cublas 矩阵库函数实现矩阵相乘

2014-08-10 cublas中执行矩阵乘法运算的函数 首先要注意的是cublas使用的是以列为主的存储方式,和c/c++中的以行为主的方式是不一样的.处理方法可参考下面的注释代码 // SOME PRECAUTIONS: // IF WE WANT TO CALCULATE ROW-MAJOR MATRIX MULTIPLY C = A * B, // WE JUST NEED CALL CUBLAS API IN A REVERSE ORDER: cublasSegemm(B, A)!

c矩阵相乘

1 #include <stdio.h> 2 #define MAX 10 3 void MatrixMutiply(int m,int n,int l,int MatrixA[MAX][MAX],int MatrixB[MAX][MAX],int MatrixResult[MAX][MAX]) 4 { 5 int i,j,k; 6 int Sum; 7 //嵌套循环计算结果矩阵(m*l)的每个元素 8 for(i=0;i<m;i++) 9 for(j=0;j<l;j++) 10

矩阵相乘(C语言实现)

---恢复内容开始--- 矩阵相乘程序的简单C语言实现: 这是矩阵相乘的公式: 源代码: 1 #include<stdio.h> 2 #include<stdlib.h> 3 #define M 100 4 5 int main(void) 6 { 7 int i,j,k,matrix1[M][M],matrix2[M][M],row1,col1,row2,col2,matrix[M][M]; 8 /*为需要相乘的两个矩阵赋值:*/ 9 printf("输入第一个矩阵的行

hdu 4965 矩阵快速幂 矩阵相乘性质

Fast Matrix Calculation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 170    Accepted Submission(s): 99 Problem Description One day, Alice and Bob felt bored again, Bob knows Alice is a gir

HDU 4965 Fast Matrix Calculation (矩阵快速幂取模----矩阵相乘满足结合律)

http://acm.hdu.edu.cn/showproblem.php?pid=4965 利用相乘的可结合性先算B*A,得到6*6的矩阵,利用矩阵快速幂取模即可水过. 1 #include<iostream> 2 #include<stdio.h> 3 #include<iostream> 4 #include<stdio.h> 5 #define N 1010 6 #define M 1010 7 #define K 6 8 using namespa

hdu 4920 快速矩阵相乘 以后得换一种写法了

[题意]:求两个矩阵相乘的结果 1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 using namespace std; 5 #define mod 3 6 7 int a[808][802],b[808][802]; 8 int c[808][808],n; 9 10 void mul() 11 { 12 for(int i=0; i<n; i++) 13 for(int j=0; j&

MapReduce实现矩阵相乘

前言 MapReduce打开了并行计算的大门,让我们个人开发者有了处理大数据的能力.但想用好MapReduce,把原来单机算法并行化,也不是一件容易事情.很多的时候,我们需要从单机算法能否矩阵化去思考,所以矩阵操作就变成了算法并行化的基础. 矩阵介绍 为了方便说明,举两个矩阵作为示例: , 容易看出,是一个矩阵,是一个矩阵,我们能够算出: 这三个矩阵当然不大,但作为示例,它们将暂时享受大矩阵的待遇. 矩阵稀疏存储 理论上,在一个文件中存储4000万*4000万的矩阵当然是可以的,但非常失之优雅,

HDU 4920 Matrix multiplication 矩阵相乘。稀疏矩阵

Matrix multiplication Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 1775    Accepted Submission(s): 796 Problem Description Given two matrices A and B of size n×n, find the product of them.

【CUDA并行编程之四】矩阵相乘

前面介绍了基本的Cuda编程的相关知识,那么这一篇在此基础之上来看看GPU在处理数据计算上的高效能,我们拿矩阵相乘来作为例子. 1.CPU上执行矩阵相乘以及性能. 在CPU上进行矩阵相乘运算的代码: mat_mul.cc: <span style="font-family:Microsoft YaHei;font-size:18px;">//a[i]*b[i] + c[i] = d[i] #include<iostream> #include<vector

C语言 &#183; 矩阵相乘 &#183; 算法提高

算法提高 矩阵相乘 时间限制:1.0s   内存限制:256.0MB 问题描述 小明最近在为线性代数而头疼,线性代数确实很抽象(也很无聊),可惜他的老师正在讲这矩阵乘法这一段内容. 当然,小明上课打瞌睡也没问题,但线性代数的习题可是很可怕的. 小明希望你来帮他完成这个任务. 现在给你一个ai行aj列的矩阵和一个bi行bj列的矩阵, 要你求出他们相乘的积(当然也是矩阵). (输入数据保证aj=bi,不需要判断) 输入格式 输入文件共有ai+bi+2行,并且输入的所有数为整数(long long范围