1. 程式人生 > >最優三角剖分

最優三角剖分

return min std esp div 技術分享 include %d logs

同樣是紫書上的題。

紫書上並沒有給出每一個三角形所貢獻的的權值的計算方法,我這裏就擅作主張,定義成點權的乘積和好了。

那麽做法是DP,這裏註意設狀態的方式(我這麽設是為了使需要求解的問題區間變得連續)。

記Vi 為第i個頂點。

設Ti, j 為Vi-1到Vj的最小積和。

技術分享

Ti, j = min{Ti, k + Tk + 1, j + ai -1 * aj * ak} k ∈ [i, j)

最後註意處理i == j || i - 1 == j的情況, 全部賦成0即可。

答案 = T2, n

#include <cstdio>

using namespace std;

const
int maxn = 105, inf = 1e9; int n; int a[maxn], t[maxn][maxn], vis[maxn][maxn], c[maxn][maxn]; int f(int x, int y) { if (vis[x][y]) return c[x][y]; vis[x][y] = 1; int& ans = c[x][y];//記憶化搜索 if (x == y || x - 1 == y) return ans = 0; ans = inf; for (int k = x; k < y; k++) {
int t1 = f(x, k), t2 = f(k + 1, y), t3 = a[x - 1] * a[y] * a[k]; int t = t1 + t2 + t3; if (t < ans) ans = t; } return ans; } int main() { scanf("%d", &n); for (int i = 1; i <= n; i++) { scanf("%d", &a[i]); } a[0] = a[n]; printf("
%d", f(2, n)); return 0; }

//

4

1 2 3 4

輸出:

18

最優三角剖分