题目大意:
有一串数字,我们要求出怎么在里面插入乘号,可以使得总乘积最大。
解题思路:
暴力不可行,这里我们用区间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])

本文介绍了一种使用区间动态规划解决数字串中插入乘号以最大化总乘积的问题。通过枚举端点并利用递归函数计算子问题,实现了高效求解。文章提供了Python实现代码,展示了如何在给定数字串上应用该算法。
3万+

被折叠的 条评论
为什么被折叠?



