dp动态规划——1039. 多边形三角剖分的最低得分

​
​
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

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值