7-3 凸多边形最优三角剖分 (10 分)(思路+详解+分析题意+动态规划)Come Baby!!!!!!!!!
一:題目:
給定n邊凸多邊形P,要求確定該凸多邊形的三角剖分(將多邊形分割成n-2個三角形),使得該三角剖分中諸三角形上權之和為最小。各邊弦的權值以由輸入數據給出,以無向圖的形式表示。三角形的權值等于三條邊權值相加。
輸入格式:
第一行輸入凸多邊形的邊數n(3<=n<=8)
第二行起,輸入頂點i(1<=i<=n)到頂點j(i<=j<=n)組成的邊或弦的權值
輸出格式:
最優三角剖分中諸三角形上權值和。
輸入樣例:
6 0 2 2 3 1 4 0 1 5 2 3 0 2 1 4 0 6 2 0 1 0輸出樣例:
24二:分析題意:
有沒有兄弟搞不清題目當中 使得該三角剖分中諸三角形上權之和為最小這句話,反正我是讀了幾十遍,沒讀懂
后來看了一篇博客,上面給解釋了,這個也就是當將凸多變形剖分完成后,求取所有三角形的周長和使其最小
三:思路:
1.凸多邊形的三角剖分是將凸多邊形分割成互不相交的三角
形的弦的集合。
2.最優三角剖分中諸三角形上權值和:指的是將多邊形劃分成多個三角形
其所有的三角形的周長和最小
3.和矩陣連相乘的思路比較:凸三角形的剖分是通過一個三角形將多邊形劃分成不同的兩部分和一個三角形。
聯想矩陣鏈的遞推方程:將其劃分成兩個不同的子鏈+這兩個自鏈所構成的矩陣乘法次數
相同點:兩種思路一致,
不同點:矩陣連計算次數是 pi-1 * pK* pj
多變形是 三邊之和
4.關于遞推方程:t[i][j] = t[i][k] + t[k+1][j] + w(i-1,k,j);
這里需要說明的是t[i][j]即表示的是多邊形的剖分最小權值和(所有三角形的)
比如t[1][6] = t[1][1] + t[2][6] + w(0,1,6), (7個頂點)
通過點0,1,6將多邊形剖分成三部分
其中t[1][1] = 0(三角剖分中 只有一條邊的是不可以 被剖分成 多邊形的 故其權值和為0)
t[2][6] 表示的是剩下的多變形,然后再求取它的最小值
通過這樣的分析:我們可以得知 t[2][6],也就相當于矩陣連相乘問題中的
子鏈,那么我就還是可以通過建網格來存儲每個多邊形的最小權值和
來進行求解
5.本題題解:
通過上述分析我們可以得出:
求取凸多邊形最優三角剖分 = t[1][n - 1];
6:這里有一張圖是 將 矩陣鏈中的矩陣映射在凸多變形的邊上,方便兄弟們更容易理解算法
四:上碼:
/**分析: 1.凸多邊形的三角剖分是將凸多邊形分割成互不相交的三角形的弦的集合。2.最優三角剖分中諸三角形上權值和:指的是將多邊形劃分成多個三角形其所有的三角形的周長和最小3.和矩陣連相乘的思路比較:凸三角形的剖分是通過一個三角形將多邊形劃分成不同的兩部分和一個三角形。聯想矩陣鏈的遞推方程:將其劃分成兩個不同的子鏈+這兩個自鏈所構成的矩陣乘法次數相同點:兩種思路一致,不同點:矩陣連計算次數是 pi-1 * pK* pj 多變形是 三邊之和 4.關于遞推方程:t[i][j] = t[i][k] + t[k+1][j] + w(i-1,k,j);這里需要說明的是t[i][j]即表示的是多邊形的剖分最小權值和(所有三角形的)比如t[1][6] = t[1][1] + t[2][6] + w(0,1,6),通過點0,1,6將多邊形剖分成三部分其中t[1][1] = 0(三角剖分中 只有一條邊的是不可以 被剖分成 多邊形的 故其權值和為0)t[2][6] 表示的是剩下的多變形,然后再求取它的最小值通過這樣的分析:我們可以得知 t[2][6],也就相當于矩陣連相乘問題中的子鏈,那么我就還是可以通過建網格來存儲每個多邊形的最小權值和來進行求解5.本題題解:通過上述分析我們可以得出: 求取凸多邊形最優三角剖分 = t[1][n]; */ #include<bits/stdc++.h> using namespace std;int array1[200][200];//剖分三角形的周長 int C_triangle(int i,int k,int j){return array1[i][k] + array1[k][j] + array1[i][j]; } int main(){int N;cin >> N;int m[200][200];//比如有7個頂點(v0,v1..v6),我們數組中存的是邊長和弦長 for(int i = 0; i < N; i++){for(int j = i; j < N; j++){cin >> array1[i][j];}}// for(int i = 1; i <= N; i++){ // for(int j = 1; j <= N; j++){ // cout << array[i][j] << ' '; // } // cout << endl; // }for(int i = 0; i <= N; i++){m[i][i] = 0;}//開始劃分網格和更新for(int i = N - 1; i >= 1; i--){for(int j = i+1; j <= N - 1; j++){//這里j從i+1開始,因為從i開始每次m[i][i] = 0; 這里j <= N 表示的是這一行到最后比如m[i][N] //初始化二維數組 m[i][j] = m[i][i] + m[i+1][j] + C_triangle(i-1,i,j);for(int k = i+1; k < j; k++){int temp = m[i][k] + m[k+1][j] + C_triangle(i-1,k,j);if(temp < m[i][j]){m[i][j] = temp;} } }} // for(int i = 1; i < N; i++){ // for(int j = 1; j < N; j++){ // cout << m[i][j] << ' '; // } // cout << endl; // }// cout << C_triangle(4,5,6); cout << m[1][N-1];}
加油陌生人!我們共勉!如有疑問請留言!
總結
以上是生活随笔為你收集整理的7-3 凸多边形最优三角剖分 (10 分)(思路+详解+分析题意+动态规划)Come Baby!!!!!!!!!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 共 46 人,2023 年中国科学院、中
- 下一篇: 苹果将放弃指纹识别技术 未来iPhone