题目大意:

有一串数字,我们要求出怎么在里面插入乘号,可以使得总乘积最大。

解题思路:

暴力不可行,这里我们用区间DP,所谓的区间DP就是状态里面包含有区间的端点,然后不断推。这里的转移方程为:

for i l->n-1:

dp[l][k]=max(dp[l][k],dp[i+1][k-1]*no)

其中,dp[l][k]表示左端点在l处时还可以划分为k段的时候最大乘积是多少。i就是枚举后面的端点。no表示假如这样枚举导致的新的数是多少。这题需要写高精度,但是我用python水过去了。这里用的是py2,大家假如用py3,把里面的raw_input换为input就可以了。

ls=raw_input().split(" ")
n=int(ls[0])
k=int(ls[1])
k+=1
an=raw_input()
dp=[]
inf=1e100
def dfs(l,k):
if k==1:
return int(an[l:n])
if n-l<k:
return -inf
if dp[l][k]!=-1:return dp[l][k]
for nx in range(l,n-1):
dp[l][k]=max(dp[l][k],dfs(nx+1,k-1)*int(an[l:nx+1]))
return dp[l][k]

for i in range(n+10):
dp.append([])
for j in range(k+10):
dp[-1].append(-1)
dfs(0,k)
print(dp[0][k])