class Solution {
int [][] memory; // 二维数组用来记录已经探测过的节点
int n; // 顶点个数
public int minScoreTriangulation(int[] values) {
n = values.length; // 获取顶点个数
memory = new int [n][n]; // 定义数组 利用其值是否为0来判断memory[i][j]对应的顶点区间是否处理过
return dp(0, n-1, values); // 递归
}
/**
* 由顶点i开始到顶点j结束的若干个顶点组成的多边形的最小剖分结果
*/
private int dp(int i, int j, int[] values){
// 数组中已记录结果,直接返回
if(memory[i][j] != 0){
return memory[i][j];
}
int value = Integer.MAX_VALUE; // 初始化最小剖分结果
if(j < i + 2){
// 只有两个顶点,不构成多边形,结果为0
return 0;
}else{
// 穷举起始顶点i和终止顶点j之间的所有顶点k,作为拆分点
for(int k = i + 1; k < j; k++){
value = Math.min(value, dp(i, k, values) + values[i] * values[k] * values[j] + dp(k, j, values));
}
}
memory[i][j] = value; // 记录结果
return value;
}
}
主要思路是:
1.对多边形进行整体动态切割,包括一个三角形和两个递归多边形。动态功能由k值完成
2.对于最小分割单元——三角形进行直接计算返回,这样就可以将问题拆分为递归问题,
每次返回动态筛选的最小值
注:灵感来源于leetcode作者:lxk1203