動態規劃——《2》矩陣鏈乘法

問題描述:

  給定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;
	}


演示結果:


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章