時間限制: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 這條邊,必定有乙個頂點與這條邊形成乙個三...