回 帖 发 新 帖 刷新版面

主题:让我们一起努力,可以吗

设有一个长度N的数字串,要求选手使用K个乘号将它分成K+1个部分,找出一种分法,使得这K+1部分的乘积能够为最大。同时,为了帮助选手能够正确理解题意,主持人还举了如下的一个例子:
有一个数字串:312,当N=3,K=1 时会有以下两种分法:
1) 3*12=36
2) 31*2=62
这时,符合题目要求的结果是: 31*2=62
现在,请你帮助你的好朋友XZ设计一个程序,求得正确答案。

回复列表 (共7个回复)

沙发

为使乘积最大 似乎只要一个乘号
这样用穷举法 即可求出最大数

板凳

经典dp题


f(i,j)是右起前1-i位分成j段的最佳方案
f(i,j) = max{ f(w,j-1)*bit(i,w+1) }

bit(i,j)表示第i到第j位组成的数字

目标就是求 f(len(num),k+1)

再考虑一下边界 比如i<1,k=1等等

3 楼

input n&
m$=ltrim$(str$(n&))
l%=len(m$)
for i%=1 to l&-1
  a$=left$(m$,i%)
  x&=val(a$)  
  b$=right$(m$,l&-i%)
  y&=val(b$)
  s&=x&*y&
  if s&>maxs& then
     maxs&=s&
     maxx&=x&
     maxy&=y&
  end if
next
print x&,y&,maxs&

4 楼

一个乘号固然最大,但如果题目要求用K个(K>1)乘号怎么办?

5 楼

1. 题目要求乘积最大化
2. 如果固定K为常量
    分发K个for循环,从子段中循环索取
3. 如果穷举K
    用do及数组标志根据范围全部检测一次

6 楼

这简单。。。
input "k=",k
for i=1 to k
print k">1*";
next i

7 楼

是个好数学题
可以象算我那个数字和问题那样
1。先算一个乘号的,这样必然把数字串分成两部分
2。在两个数字串里分别计算怎样用一个乘号分可以得到最大的乘积,比较两个结果,取大的那个乘号,这样整个数字串就被分为三部分了
3。继续第2步,直到有了n个乘号

我来回复

您尚未登录,请登录后再回复。点此登录或注册