凸多邊形的三角剖分

別看名字這麼毒瘤,實際上是個區間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 }
代碼
相關文章
相關標籤/搜索