最優三角剖分
阿新 • • 發佈:2017-10-25
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; constint 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
最優三角剖分