题源
区间dp
dp[i][j]表示区间i到j的最小值,而i<k<j,表示最后选择第k个数的情况
代码如下:
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long ll;
const ll MAX = 1000 + 1;
const ll M = 0xffffffff;
ll num[MAX] = { 0 };
ll dp[MAX][MAX] = { {0} };
int n;
int main()
{
while (cin >> n)
{
for (int i = 1; i <= n; i++)scanf_s("%lld", num + i);
ll ans = 0;
for (int r = 2; r < n; r++)
{
for (int i = 1; i + r <= n; i++)
{
int j = i + r; dp[i][j] = M;
for (int k = i + 1; k <= j - 1; k++)
{
ll tmp = num[i] * num[k] * num[j];//cout << tmp << endl;
dp[i][j] = min(dp[i][j], dp[i][k] + dp[k][j] + tmp);
}
}
}
cout << dp[1][n] << endl;
}
return 0;
}