http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1602
用D[i][j]表示从i到j的最小值,假设t为最后一个乘积点,则D[i][j] = min{D[i][t] + D[t][j] + a[i] * a[t] * a[j]} (i < t < j)
#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
#include <string.h>
#include <stdio.h>
using namespace std;
#define MAXINT 0x7FFFFFFF
int main()
{
int N, a[100];
int matrix[100][100];
while (cin >> N)
{
for (int i = 0; i < N; i++)
cin >> a[i];
memset(matrix, 0, sizeof(matrix));
int dist = 2;
while (dist < N)
{
for (int i = 0; i + dist < N; i++) // [i, i+dist]
{
int min = MAXINT;
for (int j = i + 1; j <= i + dist - 1; j++)
{
int tmp = matrix[i][j] + matrix[j][i + dist] + a[i] * a[j] * a[i + dist];
if (tmp < min)
min = tmp;
}
matrix[i][i + dist] = min;
}
dist++;
}
cout << matrix[0][N - 1] << endl;
}
}