leetcode_1039. Minimum Score Triangulation of Polygon_動態規劃

 https://leetcode.com/problems/minimum-score-triangulation-of-polygon/node

題意:給定一個凸的N邊形(N<=50),每一個頂點有一個權值A[i],把它分爲N-2個三角形,每一個三角形的val等於三個頂點的權值的乘積,問劃分以後圖形的val總和最小爲多少。spa


 

一開始想到了,問題能夠轉換爲求解子問題,因爲沒有想到如何進行狀態轉換,而且感受貪心可行,3d

以下圖1,將當前圖形能夠構成的三角形找出(紅線爲底邊),從中找到val最小的三角形如圖2,而後將其割除如圖3,再將新的兩個三角形找出。code

   

然而這個思路並不可行,這個思路的局部最優並不能獲得全局最優,按照上面的思路的策略以下圖,獲得結果40,而最優解是24。blog

貪心不可行,每次找到最優的三角形,最終全局未必最優。leetcode


而後,想到極可能是動態規劃,可是想不出來,問題如何分解,狀態如何表示。。。get

參考別人的思路和代碼(看了兩個大佬的代碼,思路幾乎同樣)io

對於多邊形上的任意一條邊,它只能出如今一個三角形中,class

dp[i][j]:從第i個點到第j個點的最小值。dp[i][j] = min(dp[i][j], dp[i][k]+dp[k][j]+A[i]*A[j]*A[k])。遍歷

以下圖:此時求dp[0][5],以(0,5)爲邊,在(0,5)之間遍歷三角形的頂點,構成的每一個三角形將原圖形分爲三部分:三角形,子圖形1,子圖形2。

class Solution { public: int minScoreTriangulation(vector<int>& A) { int dp[50][50]; memset(dp,0,sizeof(dp)); int numofnode = A.size(); for(int len=3; len<=numofnode; len++) for(int i=0; i+len-1<numofnode; i++) { int j=i+len-1; dp[i][j]=INT_MAX; for(int k=i+1; k<j; k++) dp[i][j] = min(dp[i][j],dp[i][k]+dp[k][j]+A[i]*A[j]*A[k]); } return dp[0][A.size()-1]; } };
相關文章
相關標籤/搜索