最大的算式
源程序名 BIGEXP.??? (PAS,C,CPP)
可执行文件名 BIGEXP.EXE
输入文件名 BIGEXP.IN
输出文件名 BIGEXP.OUT
题目很简单,给出N个数字,不改变它们的相对位置,在中间加入K个乘号和N-K-1个加号,(括号随便加)使最终结果尽量大。因为乘号和加号一共就是N-1个了,所以恰好每两个相邻数字之间都有一个符号。例如:
N=5, K=2,5个数字分别为1、2、3、4、5,可以加成:
1*2*(3+4+5)=24
1*(2+3)*(4+5)=45
(1*2+3)*(4+5)=45
……
输入
输入文件共有二行,第一行为两个有空格隔开的整数,表示N和K,其中(2<=N<=15, 0<=K<=N-1)。第二行为 N个用空格隔开的数字(每个数字在0到9之间)。
输出
输出文件仅一行包含一个整数,表示要求的最大的结果
样例
BIGEXP.IN
5 2
1 2 3 4 5
BIGEXP.OUT
120
说明
(1+2+3)*4*5=120
==========================
==============================
var
n,k:longint;
a:array[1..15]of longint;
f:array[0..15,0..15,0..15]of int64;
procedure init;
begin
assign(input,'bigexp.in');
assign(output,'bigexp.out');
reset(input); rewrite(output);
end;
procedure terminate;
begin
close(input); close(output);
halt;
end;
function min(a,b:longint):longint;
begin
if a>b then exit(b);
exit(a);
end;
function dfs(s,t,k:longint):int64;
var
i,j:longint;
begin
if f[s,t,k]<>-1 then exit(f[s,t,k]);
if k>t-s then begin f[s,t,k]:=-10000; exit(-10000); end;
dfs:=0;
for i:=s to t-1 do
for j:=0 to k do
begin
//if (k-j<=t-i-1)and(k-j>=0) then
if dfs<dfs(s,i,j)+dfs(i+1,t,k-j) then dfs:=dfs(s,i,j)+dfs(i+1,t,k-j);
//if (k-j-1<=t-j-1)and(k-j-1>=0) then
if dfs<dfs(s,i,j)*dfs(i+1,t,k-j-1) then dfs:=dfs(s,i,j)*dfs(i+1,t,k-j-1);
end;
f[s,t,k]:=dfs;
end;
procedure main;
var
i,j,k1:longint;
begin
readln(n,k);
for i:=1 to n do read(a[i]);
for i:=0 to 15 do
for j:=0 to 15 do
for k1:=0 to 15 do
f[i,j,k1]:=-1;
for i:=1 to n do f[i,i,0]:=a[i];
writeln(dfs(1,n,k));
end;
begin
init;
main;
terminate;
end.