凸多边形的三角剖分(division.c/cpp/pas)
给定一具有N 个顶点(从1 到N 编号)的凸多边形,每个顶点的权均已知。问如何把
这个凸多边形划分成N-2个互不相交的三角形,使得这些三角形顶点的权的乘积之和最小?
输入数据:
第一行 顶点数N (N<50)。
第二行 N 个顶点(从1到N)的权值,权值为小于32768 的整数。
输出数据:
第一行为各三角形顶点的权的乘积之和最小值。
样例
division.in
5
121 122 123 245 231
division.out
12214884
=============================
经典题
注意利用题目条件“权值为小于32768 的整数”确定边界
====================
var
n:longint;
a:array[1..50]of int64;
f:array[1..51,1..51]of int64;
procedure init;
begin
assign(input,'division.in');
assign(output,'division.out');
reset(input); rewrite(output);
end;
procedure terminate;
begin
close(input); close(output);
halt;
end;
function min(a,b:int64):int64;
begin
if a>b then exit(b);
exit(a);
end;
procedure main;
var
i,j,k:longint;
begin
readln(n);
for i:=1 to n do read(a[i]);
for i:=1 to n do
for j:=1 to n do
f[i,j]:=32767*32767*32767;
for i:=1 to n do
begin
f[i,i]:=0;
f[i,i+1]:=0;
end;
for i:=n-2 downto 1 do
for j:=i+2 to n do
for k:=i+1 to j-1 do
f[i,j]:=min(f[i,j],f[i,k]+f[k,j]+a[i]*a[k]*a[j]);
writeln(f[1,n]);
end;
begin
init;
main;
terminate;
end.