區間DP 最優三角剖分

2021-08-19 15:15:11 字數 1565 閱讀 3067

最優三角剖分有很多種型別,如:求讓所有三角形權值和最大的方案、所有三角形權值和最小的方案、所有三角形最大三角形面積最小的方案........

但是不論怎麼變化,他們的解題思路都是相同的,只是狀態轉移方程有些許的差別而已,首先我們先看第三種情況.......

栗子:uva 1331

在乙個任意多邊形中進行三角形剖分,求使得三角形中最大三角形面積最小的面積

假設在乙個凸多邊形中,設dp[i][j] 表示在點中最大的剖分出三角形的最大面積,假設在位置k處(i

(來自於:

那麼我們根據k點將面積分成了三個區域,分別為 △ijk 、f(i,k)  、 f(k,j),那麼我們只需要找出這三個面積中最大值,然後和現在dp[i][j]的值去乙個較小的值,就是當前區域中的答案,我們還會發現,f(k,j) 和 f(i,k)的大小在我們之前已經計算過了,那麼這就是我們的區間dp的最優子結構,所以我們可以得到狀態轉移方程:

dp[i][j] = min( dp[i][j] , max(s△ijk  , max(f(i,k) , f(k,j) ) ) )

那麼當我們的多邊形不是凸多邊形怎麼辦呢?

如果不是凸多邊形的話,我們的劃分三角形時,我們要判斷這條線是否在三角內部

(來自於:

像上面的2-5之間的連線就不在多邊形內部,這種情況的話,就一定會有乙個點在三角形內部,那麼我們判斷是否符合情況的話,我們可以遍歷每乙個點,然後計算這個點和三條邊產生三個三角形的面積和,如果等於s△ijk,那麼就在三角形內部,不等於,就不在三角形內部,

剩下的就是區間dp的內容了

#include #include #include #include #include #define inf 0x3f3f3f3f

#define eps 0.0001

using namespace std;//因為不確定是否為凸多邊形,所以要判斷三角形是否符合情況

const int maxn = 55;

//海**式: p = (a+b+c)/2 s = sqrt(p*(p-a)*(p-b)*(p-c))

struct point

p[maxn];

int n;

double dp[maxn][maxn];//表示在區間[i,j]中的面積最大值

double dis(int x,int y)

double area(int x,int y,int z)//根據海**式得到三角形的面積

bool check(int x,int y,int z)//判斷這個面積是否合法,也就是判斷是否有其他的點在三角形內部,如果有那麼就不合法,沒有就是合法的

return 1;

}int main()

int main()

}printf("%d\n",dp[1][n]);}}

dp 最優三角剖分問題

額,基本和演算法分析上的差不多,只是更加了解dp的狀態吧 include include include include include includeusing namespace std define max 100 int n int t max max s max max int value...

凸三角形最優三角剖分

1 凸多邊形的三角剖分 將凸多邊形分割成互不相交的三角形的弦的集合t。2 最優剖分 給定凸多邊形p,以及定義在由多邊形的邊和弦組成的三角形上的權函式w。要求確定該凸多邊形的三角剖分,使得該三角剖分中諸三角形上權之和為最小。下圖為剖分案例。若凸 n 1 邊形p 的最優三角剖分t包含三角形v0vkvn,...

UVA 1331 區間DP 三角剖分

題目文件 題目大意 按照順時針或者逆時針的順序給出多邊的點,要將這個多邊形分解成n 2個三角形,要求使得這些三角行中面積最大的三角形面積盡量小,求最小值。分析 設dp i j 為i,i 1,i 2,j 1這個多邊形的最大三角形面積的最小值,則很容易得出dp i j min dp i j max s ...