codeforces 1140D
题意:
给
定
一
个
正
n
边
形
,
各
顶
点
权
值
为
1
—
n
。
给定一个正n边形,各顶点权值为1—n。
给定一个正n边形,各顶点权值为1—n。
现
将
其
分
割
为
若
干
个
无
公
共
区
域
的
三
角
形
,
所
有
三
角
形
的
总
面
积
和
等
于
多
边
形
面
积
。
现将其分割为若干个无公共区域的三角形,所有三角形的总面积和等于多边形面积。
现将其分割为若干个无公共区域的三角形,所有三角形的总面积和等于多边形面积。
问
所
有
三
角
形
的
最
小
权
重
和
。
问所有三角形的最小权重和。
问所有三角形的最小权重和。
题解:
d p [ l ] [ r ] 表 示 正 n 边 形 第 l 个 顶 点 到 第 r 个 顶 点 的 连 续 区 间 内 , 三 角 形 分 割 方 案 的 最 优 解 。 dp[l][r]表示正n边形第l个顶点到第r个顶点的连续区间内,三角形分割方案的最优解。 dp[l][r]表示正n边形第l个顶点到第r个顶点的连续区间内,三角形分割方案的最优解。
- 枚 举 分 割 点 k , d p [ l ] [ r ] = m i n ( d p [ l ] [ r ] , d p [ l ] [ k ] + d p [ k ] [ r ] + l ∗ k ∗ r ) 枚举分割点k,dp[l][r] = min(dp[l][r], dp[l][k]+dp[k][r]+l*k*r) 枚举分割点k,dp[l][r]=min(dp[l][r],dp[l][k]+dp[k][r]+l∗k∗r)
#include <bits\stdc++.h>
using namespace std;
const int N = 501;
long long dp[N][N];
int main() {
int n;
cin >> n;
for(int len = 3 ; len <= n ; len++){
for(int l = 1, r = len ; r <= n ; l++, r++){
dp[l][r] = 1 << 30;
for(int k = l ; k <= r ; k++){
dp[l][r] = min(dp[l][r], dp[l][k]+dp[k][r]+l*k*r);
}
}
}
cout << dp[1][n] << endl;
return 0;
}