题目没有以明显得矩阵链乘的形式给出来,但是按照它的规则去做就发现是可以转换成矩阵连乘的,注意些递推程序的时候,长区间的值要依赖短区间的值,所以还要有区间长度的循环,并且每次进入新的长区间进行划分之前,都要用短区间来更新长区间的初值
// POJ1651.cpp : 定义控制台应用程序的入口点。
//
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string.h>
using namespace std;
const int maxn = 105;
int dp[maxn][maxn];
int p[maxn];
int main()
{
int num = 0;
cin >> num;
memset(dp, 0, sizeof(dp));
for (int i = 0; i < num; i++)
cin >> p[i];
int n = num - 1;
for (int i = 0; i <n; i++)
dp[i][i] = 0;
int j = 0;
for (int len = 2; len <= n;len++)
for (int i = 1; i <= n - len+1 ; i++)
{
j = i + len - 1;
dp[i][j] = dp[i + 1][j] + p[i - 1] * p[i] * p[j];//用更短区间的值来更新长区间的初值
for (int k = i; k < j; k++)//再进一步划分长区间来寻找是否存在更小的值
{
int ans = dp[i][k] + dp[k + 1][j] + p[i - 1] * p[k] * p[j];
if (dp[i][j] > ans)
dp[i][j] = ans;
}
}
cout << dp[1][n] << endl;
return 0;
}