zoukankan      html  css  js  c++  java
  • leetcode 1039. 多边形三角剖分的最低得分(区间dp)

    题意:

    给定 N,想象一个凸 N 边多边形,其顶点按顺时针顺序依次标记为 A[0], A[i], ..., A[N-1]

    假设您将多边形剖分为 N-2 个三角形。对于每个三角形,该三角形的值是顶点标记的乘积,三角剖分的分数是进行三角剖分后所有 N-2 个三角形的值之和。

    返回多边形进行三角剖分后可以得到的最低分。

    示例 :

    输入:[3,7,4,5]
    输出:144
    解释:有两种三角剖分,可能得分分别为:3*7*5 + 4*5*7 = 245,或 3*4*5 + 3*4*7 = 144。最低分数为 144。

    思路:

    思路:区间dp。

    dp[i][j]表示,将[i,j]的点组成的多边形的最小和。

    k是(i,j)中的点。

    这个多边形可以分成三个部分,多边形[i,k],多边形[k,j],三角形(i,j,k);

    假设多边形[i,k],多边形[k,j]已知,遍历这个k,可以到这最小值。

    然后可以将问题转化为子问题,求解多边形[i,k],多边形[k,j]的最小值。

     1 const int N=50;
     2 class Solution {
     3 public:
     4     int dp[N+10][N+10];
     5     int minScoreTriangulation(vector<int>& A) {
     6         memset(dp,0x3f,sizeof(dp));
     7         int l=A.size();
     8         for(int i=0;i<l;i++)dp[i][i+1]=0;
     9         for(int len=3;len<=l;len++){
    10             for(int i=0;i+len-1<l;i++){
    11                 int j=i+len-1;
    12                 for(int k=i+1;k<j;k++){
    13                     dp[i][j]=min(dp[i][j],dp[i][k]+dp[k][j]+A[i]*A[k]*A[j]);
    14                 }
    15             }
    16         }
    17         return dp[0][l-1];
    18     }
    19 };
    View Code
  • 相关阅读:
    【linux之web服务器apache】
    【linux工具之sed实例】
    【linux工具之strace】
    【linux工具之iptables 脚本】
    【linux工具之iptables】
    【Linux抓包工具之tcpdump】
    【抓包工具之wireshark】
    【Linux 基础服务之DNS】
    c语言
    sf
  • 原文地址:https://www.cnblogs.com/ljy08163268/p/11733844.html
Copyright © 2011-2022 走看看