codeforces 1140D 区间DP

codeforces 1140D


题意:

给 定 一 个 正 n 边 形 , 各 顶 点 权 值 为 1 — n 。 给定一个正n边形,各顶点权值为1—n。 n1n
现 将 其 分 割 为 若 干 个 无 公 共 区 域 的 三 角 形 , 所 有 三 角 形 的 总 面 积 和 等 于 多 边 形 面 积 。 现将其分割为若干个无公共区域的三角形,所有三角形的总面积和等于多边形面积。
问 所 有 三 角 形 的 最 小 权 重 和 。 问所有三角形的最小权重和。


题解:

d p [ l ] [ r ] 表 示 正 n 边 形 第 l 个 顶 点 到 第 r 个 顶 点 的 连 续 区 间 内 , 三 角 形 分 割 方 案 的 最 优 解 。 dp[l][r]表示正n边形第l个顶点到第r个顶点的连续区间内,三角形分割方案的最优解。 dp[l][r]nlr

  • 枚 举 分 割 点 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) kdp[l][r]=min(dp[l][r],dp[l][k]+dp[k][r]+lkr)

#include 
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; 
}

你可能感兴趣的:(区间DP)