#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
int dp[105][105];
int a[105];
int main()
{
int n;
cin >> n;
for (int i = 1; i <= n; i++)
scanf("%d", &a[i]);
//memset(dp, 0x3f3f3f, sizeof(dp));//注意初始化问题
memset(dp, 0, sizeof(dp));
for (int len = 2; len <= n; len++)//规定长度,求出每种长度对应的最佳情况
{
for (int i = 1; i <= n-len+1; i++)//理解长度控制问题
{
int j =i+len-1;//规定长度,注意长度的控制
dp[i][j] = 0x3f3f3f3f;//每种情况的初始化,每种长度的最佳情况的初始化,注意动态规划时注意初始化问题
for (int k = i; k < j; k++)//注意规定最后一个元素的位置
{
dp[i][j] =min( dp[i][j],dp[i][k] + dp[k + 1][j] + a[i - 1] * a[k] * a[j]);//注意矩阵相乘时行列的相乘的规律
}//区间分割进行动态规划
}
}
printf("%d\n", dp[2][n]);
getchar();
getchar();
return 0;
}
(注意利用此图进行矩阵链乘的理解)(转载)
1、注意对最优矩阵链乘问题的转换,求最少运算次数,利用矩阵的行列进行区分,求解最少的运算次数
2、dp[i][j]代表第i个矩阵到第j个矩阵最少的运算次数,比如对于Ai-Aj,利用中间变量k进行区间的划分,此处注意理解矩阵相乘特点,前一矩阵行与后一矩阵的列相等时可相乘,
一个n*m矩阵由n行m列共n*m个数排列而成。两个矩阵A和B可以相乘当且仅当A的列数等于B的行数。一个N*M的矩阵乘以一个M*P的矩阵等于一个N*P的矩阵,运算量为nmp。
3、len变量用于控制长度,每次寻找规定长度的最佳方案,即求解最佳子方案(分割求解的思想)
4、此处易错点,注意循环中边界的控制,k<j,注意细节点的控制,i<=n-len+1,对应不同的长度对应不同的边界,注意想清楚