問題描述:
給定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;
}