洛谷 P1018 乘积最大(区间DP)

题目大意:

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

解题思路:

暴力不可行,这里我们用区间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])

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值