思路:本题和矩阵乘法有一定的相似处:
1.我们用从0~n-1的方式给数组a[ i ]赋值
2.引入dp[ i ][ j ]二维数组来表示 i 到 j 的矩阵乘法的最大次数。(此处需要注意的是dp数组储存的是乘法值,相当一个矩阵,而此矩阵的长和宽分别是a[ i-1] a[ j ])
3:用for循环带入状态转移方程(此处需要注意的是n个数只能组成n-1个矩阵,因此上限是n-1)
DP状态转移方程:dp[i][j] = min(dp[i][j], dp[i][k] + dp[k + 1][j] + a[i - 1] * a[k] * a[j]);
#include<iostream>
using namespace std;
int a[105] = { 0 };
int dp[105][105];
int min(int i, int j);
int main() {
int n;
scanf_s("%d", &n);
for (int i = 0; i < n; i++) {
scanf_s("%d", &a[i]);
}
for (int d = 2; d <= n - 1; d++) {
for (int i = 1; i <= n - d + 1 - 1; i++) {
int j = i + d - 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", dp[1][n-1]);
return 0;
}
int min(int i, int j) {
return (i < j) ? i : j;
}