卡特蘭數之凸多邊形的三角分割數

2021-08-17 17:16:54 字數 1389 閱讀 2085

給定乙個n多邊形,要求用n-3條不相交的對角線把它分成n-2個三角形。求有多少種不同的方法。

為什麼是n-3條不相交的對角線?

n多邊形有n個頂點,依次將其編號為v1、v2、v3、…、vn。

從v1號到v3號連線,分成乙個三角形和乙個(n-2)邊形(因為頂點有n-3+1個)。再對(n-2)邊形重新編號,並從v1號到v3號連線,如此重複,連n-3次就可以n-2個三角形。

也就是說用不相交的對角線來分割多邊形為三角形,一定是n-3條線和n-2個三角形。

有多少種方法?

對於邊v1vn,任選一頂點vk,向v1和vn連邊。將三角形v1vnvk分割出去,剩下兩個多邊形,乙個多邊形有頂點,所以是k邊形;另乙個多邊形有頂點,所以是(n-k+1)邊形。然後繼續分割多邊形直到都變成了三角形,這個過程可以用遞迴或遞推實現。

設d(n)表示將n邊形分割成三角形的方法數。

回顧下我們分割的過程:先選邊v1vn,因為編號是我們遍的,所以不管我們選哪條邊,都可以看成v1vn。選邊v1vn只有一種可能。然後選頂點vk,vk的取值範圍為[v2,vn-1],選頂點有n-2種可能。再遞迴呼叫d(k)和d(n-k+1)去計算。

綜上,列舉k從2到n-1,累加d(k)*d(n-k+1)的值即可。

怎麼去實現?

遞推版:

由下及上,邊界d[2]=d[3]=1,

d[n]=d[2]*d[n-1]+d[3]*d[n-2]+…+d[n-2]*d[2].

#include 

#include

#include

#include

using

namespace

std;

typedef

unsigned

long

long ll;

const

int maxn=25;

int d[maxn];

void catalan()

}int main()

遞迴版:

由上及下,記憶化搜尋。

#include 

#include

#include

#include

using

namespace

std;

typedef

unsigned

long

long ll;

const

int maxn=25;

int d[maxn],vis[maxn];

int dp(int n)

int main()

凸多邊形三角劃分

傳送門 loj公升級版 這道題雖然是基礎的區間dp,但是還是很值得一說的。我們用dp i j 表示第i個點到第j個點劃分的最大值。注意我們只列舉了兩個端點,第三個頂點是我們列舉的那個k,之後發現k這個頂點可以把整個區間分成兩塊,我們就可以進行區間dp了。只不過這道題要使用高精度。需要自己過載一下,對...

凸多邊形的三角剖分

給定一具有 n 個頂點 從 1到 n 編號 的凸多邊形,每個頂點的權均已知。問如何把這個凸多邊形劃分成 n 2個互不相交的三角形,使得這些三角形頂點的權的乘積之和最小?第一行 頂點數 n n 50 第二行 n 個頂點 從 1到 n 的權值,權值為小於 32768 的整數。第一行為各三角形頂點的權的乘...

凸多邊形三角剖分問題

1 凸多邊形的三角剖分 將凸多邊形分割成互不相交的三角形的弦的集合t。2 最優剖分 給定凸多邊形p,以及定義在由多邊形的邊和弦組成的三角形上的權函式w。要求確定該凸多邊形的三角剖分,使得該三角剖分中諸三角形上權之和為最小。凸多邊形三角剖分如下圖所示 設 p v0,v1,vn 是n 1個頂點的多邊形 ...