劃分凸多邊形

2021-09-28 20:07:46 字數 1655 閱讀 9450

時間限制:800ms  記憶體限制:65535k

提交次數:0 通過次數:0

題型: 程式設計題   語言: g++;gcc;vc

問題描述:乙個正凸n邊形,可以用n-3條互不相交的對角線將正n邊形分成n-2個三角形。

現在要求讀入n邊形的n(n≤20),輸出不同劃分方法的總數(要求解的是劃分方法數,而不需要輸出各種劃分法)。

這裡,注意:

(1)頂點編號,認為頂點皆不相同,因此不允許認為將凸n邊形轉置視為相同劃分。

(2)若輸出是「no answer」,請注意大小寫和無標點。

輸入輸出舉例:

輸入: n=3, 輸出:1

輸入: n=5, 輸出:5

輸入: n=2, 輸出:no answer

輸入: n=6, 輸出:14

輸入: n=8, 輸出:132

例如:當n=5時,共有5種分法。

當n=6時,對六邊形的三角形所有劃分,請看下圖:

n,代表正凸n邊形。

不同劃分方法的總數。

5

5

題目所求的是分法總數,並不要求具體的分法。而且,n可以大到21。

因此,用簡單搜尋或列舉會耗時較多,而應該想方設法找出n為不同值時,分法總數的變化規律。

把乙個正凸n邊形的各個頂點按照順時針分別編上1,2,……,n。

頂點1,頂點n和頂點i(i∈[2, n-1])能夠構成乙個三角形s。

這樣凸n邊形就被分成三部分:乙個三角形s、乙個i邊形和乙個n+1-i邊形(i, n+1-i∈[2, n-1])。

因此,凸n邊形分為三角形總數total(n)等於i邊形的分法總數乘以n+1-i邊形的分法總數之積,還要

在i分別取2,3,……,n-1時都累加起來。

遞推公式如下:

total(n) = sum if n>=4

total(2) = total(3) = 1

注意: 2點的多邊形視為蛻化的多邊形,定義其total(2)=1,是為遞推公式推導用。

但按題目意思當n=2時輸出無解。

另外,此題需要注意的是,如果你寫的純遞迴程式可能會超時的,因為這裡遞迴存在重複,且重複數量龐大。

需要用陣列將你算過的元素儲存下來,避免重複的遞迴計算,這樣優化後,才能通過。

#include #include #include using namespace std;

int g[22]=;

int s=0;

int total(int n)

return g[n];

}}int main()

/*for(int i=1;i<=n;i++)*/}

凸多邊形的劃分

給定乙個具有 n 個頂點的凸多邊形,將頂點從 1 至 n 標號,每個頂點的權值都是乙個正整數。將這個凸多邊形劃分成 n 2 個互不相交的三角形,對於每個三角形,其三個頂點的權值相乘都可得到乙個權值乘積,試求所有三角形的頂點權值乘積之和至少為多少。輸入格式 第一行包含整數 n,表示頂點數量。第二行包含...

凸多邊形的劃分

給定乙個具有 n 個頂點的凸多邊形,將頂點從 1 至 n 標號,每個頂點的權值都是乙個正整數。將這個凸多邊形劃分成 n 2 個互不相交的三角形,對於每個三角形,其三個頂點的權值相乘都可得到乙個權值乘積,試求所有三角形的頂點權值乘積之和至少為多少。輸入格式 第一行包含整數 n,表示頂點數量。第二行包含...

凸多邊形的劃分

有乙個 n 個頂點的多邊形,每個頂點都有乙個權值,求如何劃分使得劃分後的 n 2 個三角形的權值乘積和最小。這題本意是要寫高精度的,不過這不是重點。我們考慮用 f i j 表示以 i 和 j 之間的頂點所構成的多邊形的最小權值乘積和,那麼我們考慮作為 i,j 這條邊,必定有乙個頂點與這條邊形成乙個三...