mul = a * b
不断用大的数除以小的数取余数部分直到最后能够整除为止。
while a > 0:
a,b = b % a, a
return mul// b
target = 2021
dp= [[float(“inf”)] * (target+1) for i in range(target+1)] # 创建列表的两种写法
初始化状态
for i in range(1,23): # 1能到的最远距离是22,因为22-1不大于21,所以这里右区间是23
dp[1][i] = i # 1 与 n 的最小公倍数必定是 n
for i in range(2,target+1): # 填表
从第i个数开始只填绝对值小于21的部分
for j in range(i,i+22):
当超出目标值2021时终止循环
if j > target:
break
当j等于i时,寻找上一个距离i最近的节点,第一个动作
if j == i:
寻找前面21范围以内的数,找出上一节点到i节点的最短路径
for k in range(1,22):
if i - k > 0:
取二者最小值
dp[i][j] = min(dp[i][j],dp[i-k][j])
else:
break
第二个动作就是确定i的上一节点到i的下一节点的距离
else:
dp[i][i]表示上一个节点到节点i的最短距离,然后上一节点又表示上上节点到该节点的距离,然后上上…
其实就是节点1到节点i的距离
lcm(i,j)表示i到下一节点的距离
dp[i][j]表示节点1到节点j的路径
dp[i][j] = lcm(i,j) + dp[i][i]
最后打印结果
print(dp[target][target])
💦💦对于二维DP而言,有些地方是可以优化的,可以一气呵成,将两个动作合并成一个动作,转换成一维DP。下面我们看一下代码实现。
试题D:路径 答案:10266837
最小公倍数LCM(least common multiple)的辗转相除法。
def lcm(a,b):
if a > b:
a,b = b,a
mul = a * b
不断用大的数除以小的数取余数部分直到最后能够整除为止。
while a > 0:
a,b = b % a, a
return mul// b
target = 2021
dp=[float(‘inf’) for i in range(target+1)]
初始化状态
for i in range(1,23): # 1能到的最远距离是22,因为22-1不大于21,所以这里右区间是23
dp[1][i] = i # 1 与 n 的最小公倍数必定是 n
接着就是按着前面的数据进行填表了
for i in range(23,target+1):
for j in range(1,22):
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Python开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注:Python)
适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!**
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注:Python)