区间dp
终态时是0与n - 1连成的边和另一个顶点j,遍历0 到n - 1之间的点j,取乘积最小的
则0 j n - 1,把多边形分成了3份;其中0 j n - 1为三角形,另外两个多边形(也有可能是三角形)
因此dp[0][n - 1] = dp[0][j] + dp[j][n - 1] + values[0] * values[n - 1] * values[j]
推广到i即可
class Solution { public: int dp[55][55]; int minScoreTriangulation(vector<int>& values) { memset(dp, 0, sizeof(dp)); int n =values.size(); for(int j = 2; j < n; j++) { for(int i = j - 2; i >= 0; i--) { for(int k = i + 1; k < j; k++) { if(dp[i][j] != 0) dp[i][j] = min(dp[i][j], dp[i][k] + dp[k][j] + values[i] * values[j] * values[k]); else dp[i][j] = values[i] * values[j] * values[k] + dp[i][k] + dp[k][j]; } } } return dp[0][n - 1]; } };