思路:动态规划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。(默认第一个顶点序号0和最后一个顶点5是相连的)。
注意一下:边界范围,len从3到s(s为顶点数),也就是说, 当i为0时:j范围从i+2到s-1,即默认顶点0和顶点n-1是连接的。而k是在i,j的范围内一次遍历。
class Solution { public: int minScoreTriangulation(vector<int>& A) { int dp[50][50]; memset(dp, 0, sizeof(dp)); int s = A.size(); for(int len=3; len<=s; len++){ for(int i=0; i+len-1<s; 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][s-1]; } };