1. 程式人生 > >動態規劃 凸 n 邊形三角剖分最小周長

動態規劃 凸 n 邊形三角剖分最小周長

題目

輸入凸 n 邊形 p 1 ,p 2 ,··· ,p n , 其中頂點按凸多邊形邊界的逆時針序給出,多邊形中不相鄰頂點間的連線稱
為弦。試設計一個動態規劃演算法,用若干條弦將凸邊形 p 1 ,p 2 ,··· ,p n 剖分成一些無公共區域的三角形,使
得所有三角形的周長之和最小。

優化子結構及子問題重疊性

設所有三角形周長之和最小的一個劃分為MTD,劃分的所有不相鄰頂點連線為MTLi(i從1到n-2,因為n凸多邊形劃分一定產生n-2條連線)

這個問題是要求MTD,首先最簡單的考慮是凸多邊形中最短的不相鄰頂點連線是否一定在這個MTD中,證來證去發現並不能證明這個觀點是否正確。

然後就藉助畫圖,考慮假設這個MTD已經知道,那麼會說明什麼,或者有什麼結論,最好是與子問題相關的結論,因為動態規劃的關鍵就是找到問題的優化子結構。

經過初步的畫圖觀察可以發現,n邊形劃分不相交的三角形構成的周長MTC其實是由兩部分組成:

MTC=凸多邊形的周長+2*(MTL1+……+MTLn-2

所以,我們需要做的只是找到n-2條和最小的不相鄰頂點連線MTL。問題就轉化為找到最小的MTL,相比於原始問題,問題變得有些清晰了。

現在要做的就是找到最小的MTL這個問題是否具有優化子結構?如果有,優化子結構是什麼?如果能夠根據子結構的解來構造最終問題的解?經過一番思考,終於還是一無所獲。於是翻開駱老師的《演算法設計與分析》,發現在構造優化子結構時,首先將最優的方案設出來,如在0-1揹包問題上,先設如果<x1,x2,x3,……xn>是0-1揹包問題的最優解,然後……。

那麼能不能先假設凸多邊形最優的不相鄰頂點連線劃分為<Pk1Pk2,Pk3Pk4……PiPj……PknPkm>,那麼從最優劃分中任取PiPj,如果能證明PiPj將凸多邊形分成的兩個小凸多邊形的三角形劃分也是各自的最優解,那麼原問題的最優解可以通過求解各個子問題後,組合來得到,具體就是,對於n凸多邊形T,用任意一條不相鄰的頂點PiPj將其劃分為兩個小凸多邊形T1,T2,那麼T的最優解則是MIN(T1的劃分連線長度+T2劃分的連線長度+PiPj),只需把所有小於n的凸多邊形的最小周長劃分求出來,然後遍歷所有的PiPj劃分(遍歷所有i,j |i-j|),即可得到T的最優解。

舉個例子,如圖1-1,如果<P1P4,P1P3>是五邊形的最優劃分,那麼由劃分產生的任意凸四邊形一定是該凸四邊形的最優劃分,否則,如果四邊形P1P2P3P4的最優劃分不是p1p3而是p2p4,即長度p1p3>p2p4,那麼<P1P4,P2P4>構成原問題的最優劃分,與原問題的最優劃分是<P1P4,P1P3>矛盾,因此p1p3是四邊形P1P2P3P4的最優劃分。或者說,對於凸n邊形T最優劃分<Pk1

Pk2,Pk3Pk4……PiPj……PknPkm>,其中的一條劃分PiPj將其劃分成T1,T2兩部分,如果T1或T2現在得劃分不是最優劃分,那麼通過變換T1或T2的劃分,能夠得到更優的原問題T的解,但這個解與T的最優劃分<Pk1Pk2,Pk3Pk4……PiPj……PknPkm>不符,矛盾,因此任意T的最優劃分中的PiPj劃分出的T1,T2一定是各自的最優解。

現在我們可以通過先求出所有n-1多邊形的最優解來構造n邊形的最優解。意思就是在凸n邊形中,從下向上,求每個凸五邊形的最優劃分為四邊形的劃分加上第五條邊,一定有一個最優的凸五邊形劃分,求每個凸六邊形的最優劃分為五邊形的劃分加上第五條邊,一定有一個最優的凸六邊形劃分,……。求凸n邊形的最優劃分為n-1邊形劃分加上第n條邊,一定有一個最優的凸n邊形劃分。


虛擬碼

注意:MTDik,其中i指i邊形,k指凸n邊形中共有k個i邊形,PiPj是指i-1邊形加上第i個劃分PiPj,構成i邊形的完整劃分。

1.     Ifn=3 Then

2.         return 0;

3.     Ifn=4 Then

4.         求出兩條對角線中最小的那個,返回最小劃分

5.     If n>4Then

6.       求出所有4邊形的最優劃分,即最小劃分長度MTD4k,

7.          for i=5 To n-1 Do

8.               for 凸n邊形中所有i邊形  Do

9.                    MTDik= MTDi-1k + PiPj

10.      for 凸n邊形中所有n-1邊形  Do

11.          MTD=MTD>MTDn-1k +PiPj ? MTD: MTDn-1k +PiPj

12. returnMTD

總結

待。


相關推薦

動態規劃 n 三角周長

題目輸入凸 n 邊形 p 1 ,p 2 ,··· ,p n , 其中頂點按凸多邊形邊界的逆時針序給出,多邊形中不相鄰頂點間的連線稱為弦。試設計一個動態規劃演算法,用若干條弦將凸邊形 p 1 ,p 2 ,··· ,p n 剖分成一些無公共區域的三角形,使得所有三角形的周長之和最

遞推之n的不同劃分方式

描述卡特蘭數又稱卡塔蘭數,英文名Catalan number,是組合數學中一個常出現在各種計數問題中出現的數列。以比利時的數學家歐仁·查理·卡塔蘭 (1814–1894)的名字來命名。最初,給卡塔蘭數建立的數學模型是:一個凸n邊形,通過不相交於n邊形內部的對角線,把n邊形拆分

2018.09.30【POJ3348】Cows(包)(三角

傳送門 解析: 讀優沒有寫負數又被卡了半個小時。。。 這裡採用JarrisJarrisJarris步進法求凸包。。主要講一講怎麼求多邊形面積。 思路: 滿足題意的顯然是這些點的凸包,而我們要做的就是求出凸包面積。 那麼怎麼求多邊形面積? 考慮三角剖分,我們將多

多邊形三角(演算法設計:動態規劃

一、動態規劃       和分治法類似,把原問題劃分成若干個子問題,不同的是,分治法(子問題間互相獨立),動態規劃(子問題不獨立)       動態規劃: (1)找出最優解的性質,刻畫其結構特徵 (2)遞迴地定義最優值

動態規劃多邊形三角

 問題描述 多邊形是平面上一條分段線性的閉曲線。也就是說,多邊形是由一系列首尾相接的直線段組成的。組成多邊形的各直線段稱為該多邊形的邊。多邊形相接兩條邊的連線點稱為多邊形的頂點。若多邊形的邊之間除了連線頂點外沒有別的公共點,則稱該多邊形為簡單多邊形。一個簡單多邊形將平面分為3個部分:被包圍

動態規劃-多邊形三角問題

一、 問題描述 多邊形是平面上一條分段線性的閉曲線。也就是說,多邊形是由一系列首尾相接的直線段組成的。組成多邊形的各直線段稱為該多邊形的邊。多邊形相接兩條邊的連線點稱為多邊形的頂點。若多邊形的邊之間除了連線頂點外沒有別的公共點,則稱該多邊形為簡單多邊形。一個簡

多邊形三角動態規劃

#include<stdio.h> #include<stdlib.h> #include<iostream> using namespace std; const int N=7; int Weight(int **w,int a,int b,int c) {     r

動態規劃多邊形三角

 經典dp問題  1、問題相關定義:  (1)凸多邊形的三角剖分:將凸多邊形分割成互不相交的三角形的弦的集合T。 (2)最優剖分:給定凸多邊形P,以及定義在由多邊形的邊和絃組成的三角形上的權函式w。要求確定該凸多邊形的三角剖分,使得該三角剖分中諸三角形上權之和為最小。

0014演算法筆記——【動態規劃多邊形三角

1、問題相關定義: (1)凸多邊形的三角剖分:將凸多邊形分割成互不相交的三角形的弦的集合T。 (2)最優剖分:給定凸多邊形P,以及定義在由多邊形的邊和絃組成的三角形上的權函式w。要求確定該凸多邊形的三角剖分,使得該三角剖分中諸三角形上權之和為最小。      凸多邊形三

動態規劃 O(n)時間復雜度的找零錢問題

復雜 log pac style cnblogs set ios scanf sizeof 1 //O(n)時間復雜度的找零錢問題 2 #include <iostream> 3 #include <bits/stdc++.h> 4 usi

HNCMU1387: 簡單的幾何學解題報告---判斷n個整點能否構成正n

                                       1387: 簡單的

長上升子序列(動態規劃n²)

package 實驗三; public class 最長上升子序列 { public static void main(String[] args) { E e=new E(); e.way(); e.show1(); e.show2(); e.sh

動態規劃解決N個數之和為K

問題:給定一個整數K和n個不同大小的商品,第i個物品的大小整數位ki ,尋找一個物品的子集,它們的和正好為為K ,或者確定不存在這樣的子集 用動態規劃解決問題的時候,求出問題的一個解,而不是所有的解。如果求出所有的解,我目前想到的用回溯法解決,不過要指數之間的複雜度 P(N

用對角線將n行分成三角形,問有多少種

題目描述: 用對角線將凸n~1e6邊行分成三角形,問有多少種分法.並且最後要%一個不是質數的m 題解: 第一步是用dp推出來怎麼算.dp[n] = dp[2]*dp[n-1]….dp[k]dp[n-k+1]..dp[n-1][2], dp[2] =

動態規劃n個元素出棧順序種數

問題描述 n個元素依次進棧,共有多少種出棧順序? 演算法分析 1個元素進棧,有1種出棧順序;2個元素進棧,有2種出棧順序;3個元素進棧,有5種出棧順序 我們把n個元素的出棧個數的記為f(n),

動態規劃-多邊形

時間限制:10000ms 單點時限:1000ms 記憶體限制:256MB 描述 給定一個凸多邊形的N個頂點。你需要在凸多邊形內找到M個點,使得這M個點也圍成一個凸多邊形,並且圍成的面積儘可能大

多邊形三角的兩種演算法分析

/* Name: Copyright: Author: 巧若拙 Date: 27-03-17 10:11 Description: 動態規劃--凸多邊形最優三角剖分 題目描述: 用多邊形頂點的逆時針序列表示凸多邊形,即P={v0,v1,…,vn

zoj 3537 Cake 【包 + 區間dp】 【三角

Cake Time Limit: 1 Second      Memory Limit: 32768 KB You want to hold a party. Here's a polygon-shaped cake on the table. You'd like t

Android 正 N 圓角頭像的實現

賣一下廣告,歡迎大家關注我的微信公眾號,掃一掃下方二維碼或搜尋微訊號 stormjun94(徐公碼字),即可關注。 目前專注於 Android 開發,主要分享 Android開發相關知識和一些相關的優秀文章,包括個人總結,職場經驗等。 前言 在上一篇部落格 Android 圓形頭像的兩種實現方式 中,我們

動態規劃---從左上角到右下角的價值大的路徑

一個 view algorithm sin sum ack for track cout 編程題:動態規劃---從左上角到右下角的價值最大的路徑 騰訊2016年4月2號暑假實習移動開發崗的筆試題,編程題第一題大概題目是: 一個m*n的矩陣,只能向右走或是向下走,矩陣每