栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

【2】python算法练习--动态规划专题(1)

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【2】python算法练习--动态规划专题(1)

区间dp模板题:合并石子

 

拿到这道题,根据题目所说,需要我们寻找最小合并的数值,很容易就联想到dp,去寻找子问题,化整为零。因为如果直接暴力的话,就是N的阶乘的时间复杂度,肯定没有办法在规定时间内解决问题。那我们就想:怎么样才会是最小值呢,在分析最小子问题之前,我们要明白一点就是:最后一次合并一定是左边连续的一部分和右边连续的一部分进行合并。有了这个思路,就很好的可以分解成一个一个小的子问题了,也就是从最小的两个石子开始,相互比较寻找最小值到最后连续的两部分就可以进行最后的运算。

n=int(input())
s=[0]*(n+1)#初始化前缀和
t=list(map(int,input().split()))
for i in range(1,n+1):
   s[i]=s[i-1]+t[i-1]#此处t[i-1]是因为索引下标从0开始 前缀和计算完成
'''
现在进行初始化dp数组
'''
dp=[[0]*(n+1)for _ in range(n+1)]# 下划线 为占位符
'''
开始区间dp了
'''
#设置区间 从最小的2开始 1时无意义
for len in range(2,n+1):
   l=1#设定边界 由左边界确定右界
   while(l + len - 1<=n):
      r = l + len - 1
      dp[l][r] = float("inf")#由于接下来要进行取最小值,因此把内部的值置为无穷大inf
      for k in range(l,r):
         dp[l][r]=min(dp[l][r],dp[l][k]+dp[k+1][r]+s[r]-s[l-1])
      l +=1
print(dp[1][n])

 s[r]-s[l-1]就是前缀和代表合并最后两段需要得代价。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/756850.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号