• [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
  • 相关阅读:
    百度云真实地址解析
    Ubuntu16.04~16.10(php7.0)网站环境一键搭建脚本
    Ubuntu修改WEB数据库MySQL的密码方法和windows下修改MySQL密码
    android属性动画
    android资源文件
    《2048》开发2——自定义布局
    《2048》开发1——游戏介绍和布局
    Android Studio--快捷键
    浅谈Android移动开发程序员的职业发展之路
    Android中SQLite应用详解
  • 原文地址:https://www.cnblogs.com/MekakuCityActor/p/10873622.html
Copyright © 2020-2023  润新知