zoukankan      html  css  js  c++  java
  • [cf1140D. Minimum Triangulation][dp]

    D. Minimum Triangulation
    time limit per test
    2 seconds
    memory limit per test
    256 megabytes
    input
    standard input
    output
    standard output

    You are given a regular polygon with nn vertices labeled from 11 to nn in counter-clockwise order. The triangulation of a given polygon is a set of triangles such that each vertex of each triangle is a vertex of the initial polygon, there is no pair of triangles such that their intersection has non-zero area, and the total area of all triangles is equal to the area of the given polygon. The weight of a triangulation is the sum of weigths of triangles it consists of, where the weight of a triagle is denoted as the product of labels of its vertices.

    Calculate the minimum weight among all triangulations of the polygon.

    Input

    The first line contains single integer nn (3n5003≤n≤500) — the number of vertices in the regular polygon.

    Output

    Print one integer — the minimum weight among all triangulations of the given polygon.

    Examples
    input
    Copy
    3
    
    output
    Copy
    6
    
    input
    Copy
    4
    
    output
    Copy
    18
    
    Note

    According to Wiki: polygon triangulation is the decomposition of a polygonal area (simple polygon) PP into a set of triangles, i. e., finding a set of triangles with pairwise non-intersecting interiors whose union is PP.

    In the first example the polygon is a triangle, so we don't need to cut it further, so the answer is 123=61⋅2⋅3=6.

    In the second example the polygon is a rectangle, so it should be divided into two triangles. It's optimal to cut it using diagonal 131−3 so answer is 123+134=6+12=181⋅2⋅3+1⋅3⋅4=6+12=18.

     题意:求将一个n边形分解成(n-2)个三边形花费的最小精力,其中花费的精力是所有三角形的三顶点编号乘积的和(其中编号是按照顶点的顺时针顺序编写的)

    题解:dp[i][j]表示从顶点i到j区间内需要花费的最小精力,则参照floyd通过找中介点更新dp数组的方式更新dp数组即可

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 typedef long long ll;
     4 #define debug(x) cout<<"["<<#x<<"]"<<"  "<<x<<endl;
     5 ll dp[505][505];
     6 const ll inf=1e17;
     7 int main()
     8 {
     9     int n;
    10     scanf("%d",&n);
    11     for(int i=1;i<=n;i++){
    12         for(int j=1;j<=n;j++){
    13             if(abs(i-j)<=1)dp[i][j]=0;
    14             else dp[i][j]=inf;
    15         }
    16     }
    17     for(int k=1;k<=n;k++){
    18         for(int i=1;i<=n;i++){
    19             for(int j=1;j<=n;j++){
    20                 dp[i][j]=min(dp[i][j],dp[i][k]+dp[k][j]+i*j*k);
    21             }
    22         }
    23     }
    24     printf("%lld
    ",dp[1][n]);
    25     return 0;
    26 }
    View Code
  • 相关阅读:
    javaScript中的onclick与jquery中的click区别
    javascript之parseInt的用法分析
    代码重构Refactor
    java-快捷生成Get/Set
    Java 调试和断点的介绍
    Java 运行报错:不支持发行版本 5
    实体类Json串转成DataTable
    sqlserver 如何瞬间执行上万条数据
    windows7远程连接服务器出现身份验证错误,又找不到加密Oracle修正
    MYSql 存储过程自定义跳出
  • 原文地址:https://www.cnblogs.com/MekakuCityActor/p/10873622.html
Copyright © 2011-2022 走看看