AcWing1069.凸多边形的划分(区间DP)

SLOJ P2067. 三角剖分问题

AcWing1069.凸多边形的划分(区间DP)

题目描述

给定由N顶点组成的凸多边形 每个顶点具有权值 将凸N边形剖分成N-2个三角形 求N-2个三角形顶点权值乘积之和最小?

输入格式

2行,第一行一个整数n表示3<n<100个顶点 接下来n个数w[i]表示每个顶点的权值0<w[i]<=100

输出格式

剖分成n-2个三角最小的权值乘积之和

样例

输入数据 1

5
1 2 3 4 5

输出数据 1

38

好吧,其实是从SLOJ(sszx的垃圾玩意)上面复制下来的

思路:

设dp[i][j]表示i到j这一段连续的n边形划分成两部分后最小乘积

暴力枚举i到j之间顶点k

转移方程:dp[i][j] = min(dp[i][j],(dp[i][k]+dp[k][j]+a[i]*a[j]*a[k]))

#include<bits/stdc++.h>
using namespace std;
int n;
long long a[210],dp[210][210];
int main(){
    memset(dp,0x3f,sizeof(dp));
    scanf("%d",&n);
    for(int i = 1;i<=n;i++)
        scanf("%lld",&a[i]);
    for(int i = n;i>=1;i--){
        for(int j = i+1;j<=n;j++){
            if(j-i==1) dp[i][j] = 0;
            else if(j-i==2){
                dp[i][j] = a[i]*a[i+1]*a[i+2];
            }else{
                for(int k = i+1;k<=j-1;k++)
                    dp[i][j] = min(dp[i][j],dp[i][k]+dp[k][j]+a[i]*a[j]*a[k]);
            }
        }
    }
    printf("%lld",dp[1][n]);
    return 0;
}

综上所述,我是蒟蒻

2022-10-27 21:57:04

posted @ 2022-10-27 21:57  cztq  阅读(81)  评论(0)    收藏  举报