列表

详情


NC16757. [NOIP2000]乘积最大

描述

今年是国际数学联盟确定的“2000——世界数学年”,又恰逢我国著名数学家华罗庚先生诞辰90周年。在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学智力竞赛的活动,你的一个好朋友XZ也有幸得以参加。活动中,主持人给所有参加活动的选手出了这样一道题目:
设有一个长度为N的数字串,要求选手使用K个乘号将它分成K+1个部分,找出一种分法,使得这K+1个部分的乘积能够为最大。
同时,为了帮助选手能够正确理解题意,主持人还举了如下的一个例子:
有一个数字串:312, 当N=3,K=1时会有以下两种分法:
1) 3*12=36
2) 31*2=62
这时,符合题目要求的结果是:31*2=62
现在,请你帮助你的好朋友XZ设计一个程序,求得正确的答案。

输入描述

第一行共有2个自然数N,K(6 ≤ N ≤ 40,1 ≤ K ≤ 6)
第二行是一个长度为N的数字串。

输出描述

输出所求得的最大乘积(一个自然数)。

示例1

输入:

4 2
1231

输出:

62

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

Python3(3.5.2) 解法, 执行用时: 45ms, 内存消耗: 3576K, 提交时间: 2019-08-12 20:50:37

n,maxk=map(int,input().split())
f=[[0 for i in range(maxk+1)] for j in range(n+1)]
s=int('1'+input())
for i in range(1,n+1):
    f[i][0]=int(str(s)[1:i+1])
for k in range(1,maxk+1):
    for i in range(k+1,n+1):
        for j in range(k,i):
            f[i][k]=max(f[i][k],f[j][k-1]*int(str(s)[j+1:i+1]))
print(f[n][k])

Python(2.7.3) 解法, 执行用时: 24ms, 内存消耗: 3056K, 提交时间: 2019-02-23 20:45:50

n,k=map(int,raw_input().split())
k=k+1
st="#"+raw_input()
f=[[0 for i in range(k+2)] for i in range(n+2)]
f[1][0]=1
for i in range(1,n+1):
  x=0
  for j in range(i+1,n+2):
    x=x*10+(int(st[j-1]))
    for w in range(0,k):
      f[j][w+1]=max(f[j][w+1],f[i][w]*x)
print f[n+1][k]

上一题