动态规划——《2》矩阵链乘法
2017-08-22 19:04
141 查看
问题描述:
给定n个矩阵构成一个链<A1, A2, A3, ... ,An>其中i = 1,2,3,...,n矩阵Ai的纬数位Pi-1 * Pi,对乘积A1,A2,... ,An以一种最小化标量乘法次数的方式进行加全部括号。
代码:
《Juzhen.h》
#pragma once
#include"stdafx.h"
#define MAXVALUE 1000000
#define N 6
void matrix_chain_order(int *p, int len, int m[N + 1][N + 1], int s[N + 1][N + 1])
{
int i, j, k, t;
for (i = 0; i <= N; ++i)
m[i][i] = 0;
for (t = 2; t <= N; t++) //当前链乘矩阵的长度
{
for (i = 1; i <= N - t + 1; i++) //从第一矩阵开始算起,计算长度为t的最少代价
{
j = i + t - 1;//长度为t时候的最后一个元素
m[i][j] = MAXVALUE; //初始化为最大代价
for (k = i; k <= j - 1; k++) //寻找最优的k值,使得分成两部分k在i与j-1之间
{
int temp = m[i][k] + m[k + 1][j] + p[i - 1] * p[k] * p[j];
if (temp < m[i][j])
{
m[i][j] = temp; //记录下当前的最小代价
s[i][j] = k; //记录当前的括号位置,即矩阵的编号
}
}
}
}
}
//s中存放着括号当前的位置
void print_optimal_parents(int s[N + 1][N + 1], int i, int j)
{
if (i == j)
cout << "A" << i;
else
{
cout << "(";
print_optimal_parents(s, i, s[i][j]);
print_optimal_parents(s, s[i][j] + 1, j);
cout << ")";
}
}
《main.cpp》
#include "stdafx.h"
#include"Juzhen_list.h"
int main()
{
int p[N + 1] = { 30,35,15,5,10,20,25 };
int m[N + 1][N + 1] = { 0 };
int s[N + 1][N + 1] = { 0 };
int i, j;
matrix_chain_order(p, N + 1, m, s);
cout << "m value is: " << endl;
for (i = 1; i <= N; ++i)
{
for (j = 1; j <= N; ++j)
cout << m[i][j] << " ";
cout << endl;
}
cout << "s value is: " << endl;
for (i = 1; i <= N; ++i)
{
for (j = 1; j <= N; ++j)
cout << s[i][j] << " ";
cout << endl;
}
cout << "The result is:" << endl;
print_optimal_parents(s, 1, N);
return 0;
}
演示结果:
给定n个矩阵构成一个链<A1, A2, A3, ... ,An>其中i = 1,2,3,...,n矩阵Ai的纬数位Pi-1 * Pi,对乘积A1,A2,... ,An以一种最小化标量乘法次数的方式进行加全部括号。
代码:
《Juzhen.h》
#pragma once
#include"stdafx.h"
#define MAXVALUE 1000000
#define N 6
void matrix_chain_order(int *p, int len, int m[N + 1][N + 1], int s[N + 1][N + 1])
{
int i, j, k, t;
for (i = 0; i <= N; ++i)
m[i][i] = 0;
for (t = 2; t <= N; t++) //当前链乘矩阵的长度
{
for (i = 1; i <= N - t + 1; i++) //从第一矩阵开始算起,计算长度为t的最少代价
{
j = i + t - 1;//长度为t时候的最后一个元素
m[i][j] = MAXVALUE; //初始化为最大代价
for (k = i; k <= j - 1; k++) //寻找最优的k值,使得分成两部分k在i与j-1之间
{
int temp = m[i][k] + m[k + 1][j] + p[i - 1] * p[k] * p[j];
if (temp < m[i][j])
{
m[i][j] = temp; //记录下当前的最小代价
s[i][j] = k; //记录当前的括号位置,即矩阵的编号
}
}
}
}
}
//s中存放着括号当前的位置
void print_optimal_parents(int s[N + 1][N + 1], int i, int j)
{
if (i == j)
cout << "A" << i;
else
{
cout << "(";
print_optimal_parents(s, i, s[i][j]);
print_optimal_parents(s, s[i][j] + 1, j);
cout << ")";
}
}
《main.cpp》
#include "stdafx.h"
#include"Juzhen_list.h"
int main()
{
int p[N + 1] = { 30,35,15,5,10,20,25 };
int m[N + 1][N + 1] = { 0 };
int s[N + 1][N + 1] = { 0 };
int i, j;
matrix_chain_order(p, N + 1, m, s);
cout << "m value is: " << endl;
for (i = 1; i <= N; ++i)
{
for (j = 1; j <= N; ++j)
cout << m[i][j] << " ";
cout << endl;
}
cout << "s value is: " << endl;
for (i = 1; i <= N; ++i)
{
for (j = 1; j <= N; ++j)
cout << s[i][j] << " ";
cout << endl;
}
cout << "The result is:" << endl;
print_optimal_parents(s, 1, N);
return 0;
}
演示结果:
相关文章推荐
- 动态规划 矩阵链乘法
- 【动态规划】XMU 1029 矩阵链乘法
- 动态规划——切钢筋、矩阵链乘法、菲波拉契数列和背包问题
- 矩阵链乘法(动态规划)
- 动态规划----矩阵链乘法
- 矩阵链乘法(动态规划)
- 算法导论:第15章 动态规划_2矩阵链乘法
- 动态规划 -- 矩阵链乘法
- 动态规划 矩阵链乘法
- 【算法导论】动态规划之“矩阵链乘法”问题
- 算法导论--动态规划(矩阵链乘法)
- 动态规划-矩阵链乘法(1)
- 算法导论 动态规划 矩阵链乘法
- 算法导论第15章 动态规划-矩阵链乘法
- 【动态规划】矩阵链乘法
- [动态规划] 矩阵链乘法问题
- 【动态规划】XMU 1029 矩阵链乘法
- 算法导论-第15章-动态规划:矩阵链乘法C++实现
- 动态规划-矩阵链乘法
- [动态规划] 矩阵链乘法问题