最小矩阵乘积计算次数。

###Code

POJ 1651
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
//By Brickgao
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <algorithm>
#include <vector>
using namespace std;
#define out(v) cerr << #v << ": " << (v) << endl
#define SZ(v) ((int)(v).size())
const int maxint = -1u>>1;
template <class T> bool get_max(T& a, const T &b) {return b > a? a = b, 1: 0;}
template <class T> bool get_min(T& a, const T &b) {return b < a? a = b, 1: 0;}

int n, p[110], s[110][110];

int dp(int l, int r) {
if(s[l][r] > 0)
return s[l][r];
for(int i = l + 1; i < r; i ++) {
if(s[l][r] != 0)
s[l][r] = min(dp(l, i) + dp(i, r) + p[l] * p[i] * p[r], s[l][r]);
else {
s[l][r] = dp(l, i) + dp(i, r) + p[l] * p[i] * p[r];
}
}
return s[l][r];
}

int main() {
while(scanf("%d", &n) != EOF) {
memset(s, 0, sizeof(s));
for(int i = 0; i < n; i ++) {
scanf("%d", &p[i]);
}
dp(0, n - 1);
printf("%d\n", s[0][n - 1]);
}
return 0;
}