版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
矩阵连乘的两个常见算法思路:
- 区间动态规划(由下而上计算最优子结构)
- 备忘录算法(topdown)
递归时代记忆化搜索步骤:
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;
}