列表

详情


NC50500. 凸多边形的划分

描述

给定一个具有N个顶点的凸多边形,将顶点从1至N标号,每个顶点的权值都是一个正整数。将这个凸多边形划分成N-2个互不相交的三角形,试求这些三角形顶点的权值乘积和至少为多少。

输入描述

输入第一行为顶点数N
第二行依次为顶点1至顶点N的权值。

输出描述

输出仅一行,为这些三角形顶点的权值乘积和的最小值。

示例1

输入:

5
121 122 123 245 231

输出:

12214884

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

pypy3(pypy3.6.1) 解法, 执行用时: 88ms, 内存消耗: 20688K, 提交时间: 2020-06-02 20:19:53

n=int(input())
a=list(map(int,input().split()))
dp=[[0 for i in range(n+10)]for i in range(n+10)]
for len in range(3,n+1):
    for l in range(n-len+1):
        r=l+len-1
        dp[l][r]=10**100
        for k in range(l+1,r):
            dp[l][r]=min(dp[l][r],dp[l][k]+dp[k][r]+a[l]*a[r]*a[k])
print(dp[0][n-1])

Python3(3.5.2) 解法, 执行用时: 68ms, 内存消耗: 3440K, 提交时间: 2020-06-03 10:44:58

n = int(input())
a = list(map(int, input().split()))
d = [([int(1e30)] * (n+1)) for i in range(n+1)]
for l in range(1, n):
	for i in range(0, n-l):
		j = i+l
		if(j-i == 1):
			d[i][j] = 0
			continue
		for k in range(i+1, j):
			d[i][j] = min(d[i][j], d[i][k] + d[k][j] + a[i]*a[j]*a[k])
print(d[0][n-1])


上一题