最优矩阵连乘
2013-11-12 20:18
344 查看
Problem 18: 最优矩阵连乘
Time Limit:1 Ms| Memory Limit:128 MBDifficulty:3
Description
一个n*m矩阵由n行m列共n*m个数排列而成。两个矩阵A和B可以相乘当且仅当A的列数等于B的行数。一个N*M的矩阵乘以一个M*P的矩阵等于一个N*P的矩阵,运算量为nmp。矩阵乘法满足结合律,A*B*C可以表示成(A*B)*C或者是A*(B*C),两者的运算量却不同。例如当A=2*3 B=3*4 C=4*5时,(A*B)*C=64而A*(B*C)=90。显然第一种顺序节省运算量。
现在给出N个矩阵,并输入N+1个数,第i个矩阵是a[i-1]*a[i]
Input
第一行n(n<=100)第二行n+1个数
Output
最优的运算量
Sample Input
32 3 4 5
Sample Output
64
Hint
动态规划思路:动态规划类题目,最优加括号结构, 今天刚看懂, 用一个二维数组存储最解,
ans[i][j]为第i到第j个矩阵的最优加括号解, 最终要求的就是1到n的最优加括号解即
ans[1]
, 因为求大问题要借助子问题的解, 所以要从小到大依次求解。具体请参考最
优加括号算法。
#include <stdio.h> #include <string.h> #include <stdlib.h> #define MAX 101 unsigned int ans[MAX][MAX], p[MAX], n; //数较大需要用无符号整形 int materixchain() { int i, j, k, m, temp; //临时变量 for(i = 0; i <= n; i++) { ans[i][i] = 0; } for(m = 2; m <= n; m++) //m: 矩阵个数 { for(i = 1; i <= n-m+1; i++) //i: 起始矩阵 { j = i + m - 1; //j: 结束矩阵 ans[i][j] = 0xffffffff; //初始化(大数) for(k = i; k < j; k++) //k: 分界点 遍历起始矩阵到结束矩阵找出适当分界点 { temp = ans[i][k] + ans[k+1][j] + p[i-1]*p[j]*p[k]; //例如 1 2 3 则k = 1, i - 1 = 0, j = 2 (仔细琢磨下) if(temp < ans[i][j]) { ans[i][j] = temp; } } } } return ans[1] ; } int main() { int i; scanf("%u", &n); for(i = 0; i <= n; i++) { scanf("%u", &p[i]); } printf("%u\n", materixchain()); return 0; }
相关文章推荐
- 矩阵最优连乘问题
- 矩阵连乘最优结合 动态规划求解
- UVA - 348 Optimal Array Multiplication Sequence (最优矩阵连乘)
- 基于动态规划的矩阵连乘最优方法
- 蓝桥杯 算法提高 矩阵乘法 (区间DP: 最优矩阵连乘)
- BUCT OJ 矩阵最优连乘问题
- 动态规划之最优矩阵连乘
- 最优矩阵连乘
- UVA - 348 Optimal Array Multiplication Sequence 最优矩阵连乘
- 动态规划最优矩阵连乘问题
- tyvj1198 最优矩阵连乘
- 给定n个矩阵{A1, A2, …,An},其中,Ai与Ai+1是可乘的,计算这n个矩阵的连乘积。从中找出一种乘次数最少的计算次序(矩阵连乘最优顺序Java语言实现
- 动态规划求解矩阵连乘的最优时间复杂度
- 矩阵连乘最优次序 c++实现 动态规划算法
- 矩阵最优连乘问题
- 动态规划--矩阵连乘的最优乘法顺序
- 最优矩阵连乘问题
- 动态规划之矩阵连乘
- poj 3735 Training little cats(矩阵连乘应用)
- 区间DP-矩阵连乘问题