最大K乘积问题(kmul)

本文介绍了一个基于动态规划(DP)算法解决的最大乘积分割问题。通过将字符串转换为数值并使用DP来确定如何将字符串分割为k段以获得最大乘积。程序详细展示了初始化过程和主算法流程。
算法:DP

分析:TYVJ上的乘积最大应该就来源于此题吧,与那道题唯一不同的是那道题是加乘号而这个是分成多少段,所以将k-1再按照乘积最大的方法求。

 

program kmul;

const
 maxn=10;

var
 n,k:longint;
 sum,f:array [0..maxn,0..maxn] of longint;
 
procedure init;
var
 i,j:longint;
 s,ts:string;
begin
 readln(n,k);
 readln(s);
 dec(k);
 for i:=1 to n do
  begin
   ts:='';
   for j:=i to n do
    begin
     ts:=ts+s[j];
     val(ts,sum[i,j]);
    end;
  end;
end;

procedure main;
var
 i,j,l,max:longint;
begin
 for i:=1 to n do f[i,0]:=sum[1,i];
 for i:=1 to n do
  begin
   for j:=1 to k do
    begin
     max:=-maxlongint;
     for l:=1 to i-1 do if f[l,j-1]*sum[l+1,i]>max then max:=f[l,j-1]*sum[l+1,i];
     if max<>-maxlongint then f[i,j]:=max;
    end;
  end;
end;
 
begin
 assign(input,'kmul.in'); reset(input);
 assign(output,'kmul.out'); rewrite(output);
 
 init;
 main;
 writeln(f[n,k]);
 
 close(input); close(output);
end.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值