【区间DP】最大的算式

 

最大的算式

源程序名    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.


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值