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

 

 

posted @ 2019-05-16 09:14  MekakuCityActor  阅读(342)  评论(0编辑  收藏  举报