別看名字這麼毒瘤,實際上是個區間DP...ide
可是最近線性DP作多了,竟然沒有想到......spa
題意:code
給你一個凸多邊形,n個頂點,帶點權。blog
你要把它剖分爲n - 2個三角形,代價爲每一個三角形三個頂點的乘積之和。string
求最小代價。it
咱們設f[i][j]表示[i,j]這個區間內部所組成的多邊形的最大權值。io
那麼咱們枚舉ij這條邊所在三角形的對應頂點k,這個k∈(i,j)event
而後輸出f[1][n]就好了...class
初始狀態:所有爲INF,f[i][i + 1] = 0cli
1 #include <cstdio> 2 #include <algorithm> 3 #include <cstring> 4 #define int long long 5 6 const int N = 60; 7 8 int f[N][N], a[N]; 9 10 main() { 11 int n; 12 scanf("%lld", &n); 13 for(int i = 1; i <= n; i++) { 14 scanf("%lld", &a[i]); 15 } 16 memset(f, 0x3f, sizeof(f)); 17 18 for(int i = 1; i <= n; i++) { 19 f[i][i + 1] = 0; 20 } 21 22 for(int len = 2; len < n; len++) { 23 for(int l = 1; l + len <= n; l++) { 24 int r = len + l; 25 for(int k = l + 1; k < r; k++) { 26 f[l][r] = std::min(f[l][r], f[l][k] + f[k][r] + a[l] * a[r] * a[k]); 27 } 28 } 29 } 30 31 printf("%lld", f[1][n]); 32 33 return 0; 34 }