/*
Name:最优矩阵链乘(动态规划 记忆搜索)
Actor:HT
Time:2015年7月23日
Error Reporte:
}
*/
#include"stdio.h"
#include"conio.h"
#include"string.h"
#include"iostream"
using namespace std;
int tab[300];
int map[300][300];
const int M_num = 0x3f3f3f3f; //as无限大
int search(int a,int b)
{
if(map[a][b] < M_num) return map[a][b];
if(a == b - 2)
{
map[a][b] = tab[a] * tab[b] *tab[a+1];
return map[a][b];
}
if(a > b - 2)
{
map[a][b] = 0;
return map[a][b];
}
for (int i = a + 1; i < b; i++)
{
int temp = search(a,i) + search(i,b) + tab[a]*tab[i]*tab[b];
if (temp < map[a][b]) map[a][b] = temp;
}
return map[a][b];
}
int main()
{
int i,j,n;
while(scanf("%d",&n)!=EOF)
{
for(i=0;i<n;i++)
{
scanf("%d",&tab[i]);
}
memset(map,0x3f,sizeof(map)); //memset 无限大0x3f
int ans = search(0,n-1);
printf("%d\n",ans);
}
}
//d[a][b] = 从a到b的最小乘数
//d[a][b] = min{d[a][k] + d[k+1][b] + a*(k-1)*b
//15 56 68 89 1 5 6 8 9
//1*5*6 + 6*8*9 + 1*6*9
[算法]最优矩阵链乘(动态规划 记忆化搜索)
最新推荐文章于 2020-11-24 09:41:44 发布