931. 下降路径最小和
1、基本上有思路了,试一下~结果不太对
class Solution:
def minFallingPathSum(self, matrix: List[List[int]]) -> int:
n = len(matrix)
if n == 1:
return matrix[0][0]
# 只需要知道上一行的值就行,一维dp应该就够了~初始化dp
dp = [0]*n
for i in range(n):
dp[i]=matrix[0][i]
for i in range(1,n):
for j in range(n):
if j == 1:
dp[j] = min(dp[j]+matrix[i][j],dp[j+1]+matrix[i][j])
elif j==n-1:
dp[j] = min(dp[j]+matrix[i][j],dp[j-1]+matrix[i][j])
else:
dp[j] = min(dp[j]+matrix[i][j],dp[j-1]+matrix[i][j],dp[j+1]+matrix[i][j])
return dp[n-1]
3、下面还要用dp_pre,但dp_pre已经被更改了,所以要有两个dp
还有一个问题是,python中数组浅拷贝的问题,如果直接用赋值符号,那就只拷贝了引用,不太对。
class Solution:
def minFallingPathSum(self, matrix: List[List[int]]) -> int:
n = len(matrix)
if n == 1:
return matrix[0][0]
# 只需要知道上一行的值就行,一维dp应该就够了~初始化dp
dp_pre = [0]*n
dp_now = [0]*n
for i in range(n):
dp_pre[i]=matrix[0][i]
for i in range(1,n):
for j in range(n):
if j == 0:
dp_now[j] = min(dp_pre[j]+matrix[i][j],dp_pre[j+1]+matrix[i][j])
elif j==n-1:
dp_now[j] = min(dp_pre[j]+matrix[i][j],dp_pre[j-1]+matrix[i][j])
else:
dp_now[j] = min(dp_pre[j]+matrix[i][j],dp_pre[j-1]+matrix[i][j],dp_pre[j+1]+matrix[i][j])
for s in range(n):
dp_pre[s] = dp_now[s]
return min(dp_now)
4、看下其他人怎么做的,看不太懂官方答案的python版本。
120. 三角形最小路径和
1、大概有思路了,和上题相似。
2、不对啊
def minimumTotal(self, triangle: List[List[int]]) -> int:
if len(triangle)==1:
return triangle[0][0]
dp_pre=[triangle[0][0]]
n = len(triangle)
for i in range(1,n):
dp_now=[0]*i
for j in range(i):
if j==0:
dp_now[0] = dp_pre[0]
elif j<i-1:
dp_now[j]=min(dp_pre[j],dp_pre[j-1])+triangle[i][j]
else:
dp_now[j] = dp_pre[-1]
dp_pre = [0]*i
for s in range(i):
dp_pre[s] = dp_now[s]
return min(dp_now)
3、调试了一下,发现是边界情况,忘记加自己本身的值了,鹅鹅鹅。通过了,效果比之前好一点。
class Solution:
def minimumTotal(self, triangle: List[List[int]]) -> int:
if len(triangle)==1:
return triangle[0][0]
dp_pre=[triangle[0][0]]
n = len(triangle)
for i in range(2,n+1):
dp_now=[0]*i
for j in range(i):
if j==0:
dp_now[0] = dp_pre[0]+ triangle[i - 1][j]
elif j<i-1:
dp_now[j]=min(dp_pre[j],dp_pre[j-1])+triangle[i-1][j]
else:
dp_now[j] = dp_pre[-1]+ triangle[i - 1][j]
dp_pre = [0]*i
for s in range(i):
dp_pre[s] = dp_now[s]
return min(dp_now)