您的位置:首页 > 其它

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

2010-11-05 21:07 351 查看
描述 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
5 21 2 3 4 5
样例输出 Sample Output
120
时间限制 Time Limitation
各个测试点1s
注释 Hint
对于30%的数据,N<= 10;
对于全部的数据,N <= 100。
分析:因为题目中告诉乘号和加号的总个数是一定的,所以只考虑乘号的个数即可

program p1045;
var a:array[1..100]of 0..9;
sum,f:array[1..100,1..100]of longint;
n,k,i,j:longint;

procedure init;
var i,j,ans:longint;
begin
assign(input,'input.txt');
reset(input);
assign(output,'output.txt');
rewrite(output);
readln(n,k);
for i:=1 to n do
read(a[i]);
for i:=1 to n do
begin
ans:=0;
for j:=i to n do
begin
ans:=ans+a[j];
sum[i,j]:=ans;
end;
end;
close(input);
end;

function max(a,b:longint):longint;
begin
if a>b then exit(a)
else
exit(b);
end;

procedure dp;
var i,j,l:longint;
begin
for i:=1 to n do
f[i,0]:=sum[1,i];
for i:=1 to k do
for j:=2 to n do
for l:=1 to j-1 do
f[j,i]:=max(f[j,i],f[l,i-1]*sum[l+1,j]);
writeln(f[n,k]);
end;

begin
init;
dp;
close(output);
end.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: