动态规划Part02

74 阅读2分钟

!! 记住,确定 dp数组的下标含义

写在前头的感悟

其实,很多时候随便开始就好了,不用尽心策划后再动手。

最初刷算法我是精心策划时间,每天刷几道题,哪个时间段集中用来刷题。However, 没坚持几天就被科研任务占满时间。科研之外有空,我也不想去刷题,好挫败,想逃避。现在我就不管了,跟着carl的算法训练营,每天给我布置好任务。尽量挤时间去刷,不再去管自己的情绪。

还有一个,就是问题出现了,直奔解决问题方法,忽略期间的情绪。 问题出现的时候,总会伴随着情绪的起伏。讨厌,生气,无语。当你还沉浸在这些情绪的时候,别人已经解决完问题了。时间很宝贵的!

Task

●  62.不同路径 

●  63. 不同路径 II 

今天开始逐渐有 dp的感觉了,题目不多,就两个 不同路径,可以好好研究一下

 详细布置 

 62.不同路径 

本题大家掌握动态规划的方法就可以。 数论方法 有点非主流,很难想到。 

programmercarl.com/0062.%E4%B8…

视频讲解:www.bilibili.com/video/BV1ve…

 63. 不同路径 II 

programmercarl.com/0063.%E4%B8…

视频讲解:www.bilibili.com/video/BV1Ld…

62.不同路径

创建m x n 二维链表

dp = [[0] * n for _ in range(m)]

二维DP数组遍历

63. 不同路径 II

有障碍初始化

carl版

dp = [[0] * n for _ in range(m)]

for i in range(m):
    if obstacleGrid[i][0] == 0:  # 遇到障碍物时,直接退出循环,后面默认都是0
        dp[i][0] = 1
    else:
        break
for j in range(n):
    if obstacleGrid[0][j] == 0:
        dp[0][j] = 1
    else:
        break

我版:太冗余

dp = [[0] * n for _ in range(m)]
flag = False
for i in range(n):
    if obstacleGrid[0][i] == 1:  # 遇到障碍物时,直接退出循环,后面默认都是0
        flag = True
    if flag == False:
        dp[0][i] = 1
    else:
        dp[0][i] = 0
flag = False
for i in range(m):
    if obstacleGrid[i][0] == 1:
        flag = True
    if flag == False:
        dp[i][0] = 1
    else:
        dp[i][0] = 0

开始的时候特殊值处理:障碍图的起始和终点都有障碍(我忽略了,但leetcode还是可以AC)

if obstacleGrid[m - 1][n - 1] == 1 or obstacleGrid[0][0] == 1:
            return 0