动态规划:leetcode 1039

思路:动态规划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];
    }
};

猜你喜欢

转载自www.cnblogs.com/Bella2017/p/11096389.html