覚書アルゴリズムマトリックスチェーンの問題

免責事項:この記事はブロガーオリジナル記事です、続くBY-SAのCC 4.0を著作権契約、複製、元のソースのリンクと、この文を添付してください。
このリンク: https://blog.csdn.net/ALPS233/article/details/102662416

でも、行列の乗算を考えて二つの一般的なアルゴリズム:

  1. 間隔動的プログラミング(最適下部のボトムアップ計算)
  2. 覚書アルゴリズム(トップダウン)

倍メモリ再帰検索ステップ:
ここに画像を挿入説明
M [I] [j]はiがjに記録結果を最適には、1に初期化されます。

//min_matrix_OP_beiwanglu 

#include <iostream> 
#include <stdio.h>
#include <string.h>

#define maxn 1005

using namespace std;

int m[maxn][maxn];
int n = 10;
//int a[maxn];
int a[10 + 1] ={5,4,2,6,10,7,3,8,2,9,3};    //10 matrix sample
void init()
{
	memset(m,-1,sizeof(m));	
}

int dfs(int x,int y)
{
	if(m[x][y] >= 0) return m[x][y];
	if(x == y) return m[x][y] = 0;
	
	int tmp = (int)1e9 + 7; 
	for(int k = x; k < y; k++)
		tmp = min(tmp, dfs(x,k) + dfs(k+1,y) + a[x-1] * a[k] * a[y]);
	return m[x][y] = tmp;
	
}

int main()
{
	init();
	cout<<"a[10 + 1] ={5,4,2,6,10,7,3,8,2,9,3}; 10 matrix sample as in Mi.x = a[i-1],Mi.y = a[i]"<<endl; 
	cout<<"result is "<<dfs(1,n)<<endl;
	return 0;
}

おすすめ

転載: blog.csdn.net/ALPS233/article/details/102662416