[cf1140D. Minimum Triangulation][dp]

it2022-05-05  175

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\n",dp[1][n]); 25 return 0; 26 } View Code

 

 

转载于:https://www.cnblogs.com/MekakuCityActor/p/10873622.html

相关资源:各显卡算力对照表!

最新回复(0)