博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

TYVJ P1045最大的算式(动态规划)

Posted on 2010-11-05 21:07  深处的心扉  阅读(922)  评论(0)    收藏  举报
描述 Description
  题目很简单,给出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
……







输入格式 Input Format
  输入文件共有二行,第一行为两个有空格隔开的整数,表示N和K,其中(2<=N<=15, 0<=K<=N-1)。第二行为 N个用空格隔开的数字(每个数字在0到9之间)。







输出格式 Output Format
  输出文件仅一行包含一个整数,表示要求的最大的结果
最后的结果<=maxlongint







样例输入 Sample Input
 







样例输出 Sample Output
 







时间限制 Time Limitation
  各个测试点1s







注释 Hint
  对于30%的数据,N<= 10;
对于全部的数据,N <= 100。

分析:因为题目中告诉乘号和加号的总个数是一定的,所以只考虑乘号的个数即可

 

1 program p1045;
2 var a:array[1..100]of 0..9;
3 sum,f:array[1..100,1..100]of longint;
4 n,k,i,j:longint;
5
6 procedure init;
7 var i,j,ans:longint;
8 begin
9 assign(input,'input.txt');
10 reset(input);
11 assign(output,'output.txt');
12 rewrite(output);
13 readln(n,k);
14 for i:=1 to n do
15 read(a[i]);
16 for i:=1 to n do
17 begin
18 ans:=0;
19 for j:=i to n do
20 begin
21 ans:=ans+a[j];
22 sum[i,j]:=ans;
23 end;
24 end;
25 close(input);
26 end;
27
28 function max(a,b:longint):longint;
29 begin
30 if a>b then exit(a)
31 else
32 exit(b);
33 end;
34
35 procedure dp;
36 var i,j,l:longint;
37 begin
38 for i:=1 to n do
39 f[i,0]:=sum[1,i];
40 for i:=1 to k do
41 for j:=2 to n do
42 for l:=1 to j-1 do
43 f[j,i]:=max(f[j,i],f[l,i-1]*sum[l+1,j]);
44 writeln(f[n,k]);
45 end;
46
47 begin
48 init;
49 dp;
50 close(output);
51 end.
52