【dp】最大k乘积问题

问题描述:

 设I是一个 n位十进制整数。如果将I划分为 k段,则可得到k个整数。这k个整数的乘积称为I  的一个 k乘积。试设计一个算法,对于给定的 I和 k,求出 I的最大 k乘积。

编程任务:

 对于给定的I和k,编程计算I的最大k 乘积。

数据输入:

 由文件input.txt提供输入数据。文件的第1 行中有2个正整数n和 k。正整数n是序列的长度;  正整数k是分割的段数。

 接下来的一行中是一个n位十进制整数。(n<=10)

结果输出:

 程序运行结束时,将计算结果输出到文件 output.txt 中。文件的第 1 行中的数是计算出的最  大k乘积。

样例:

 2 1

 15

15

核心思想:

 先预处理每段数字然后f[i,j]=max{f[i-p,j-1]*a[i-p+1,i],f[i,j]}前i个数字j个乘号的最大值。

var
 f,a:array[0..10,0..10]of longint;
 s:string;
 i,n,k,j,p:longint;
function max(a,b:longint):longint;
begin
 ifa>b then exit(a);
 exit(b);
end;
begin
 assign(input,'p315.in');reset(input);
 assign(output,'p315.out');rewrite(output);
 readln(n,k);
 readln(s);
 fori:=1 to n do
 begin
  a[i,i]:=ord(s[i])-ord('0');
  for j:=i+1 to n do
   a[i,j]:=a[i,j-1]*10+ord(s[j])-ord('0');
 end;
 fori:=1 to n do
 f[i,0]:=a[1,i];
 fori:=1 to n do
  forj:=1 to k-1 do
  for p:=1 to i-1 do
  f[i,j]:=max(f[i-p,j-1]*a[i-p+1,i],f[i,j]);
 writeln(f[n,k-1]);
 close(input);close(output);
end.
题目来源:《算法设计与分析》第三章动态规划

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值