前言:
现时小伙伴们对“python输出一个n阶的方阵”大体比较注意,兄弟们都想要剖析一些“python输出一个n阶的方阵”的相关知识。那么小编也在网摘上搜集了一些关于“python输出一个n阶的方阵””的相关内容,希望朋友们能喜欢,咱们快快来了解一下吧!该题涉及的算法的核心思想是动态规划。
问题:一个n阶方阵M,当M[i][j]=0时,可通过该位置(i,j). M[i][j]=1时,通过该位置并可计数加一,之后该位置M[i][j]=0. 当M[i][j]=-1时,不可通过该位置。求如何一来一回地从M[0][0]到M[n-1][n-1] ,计数值最大。
误区: 一次只计算一条最好路线,然后两次路线相加。因为计算最好路线时,若只考虑一条最大计数路线,可能出现错误的情况:第一次计算出14,第二次计算出1,相加15。而最后可能有,第一次8,第二次8,最后正确结果为16的情况。
方法:动态规划。即推导出相邻两步间的数学公式。分为自顶向下,和自底向上。
代码:自底向上。所耗内存少,但较耗时。
class Solution: def cherryPickup(self, grid: List[List[int]]) -> int: N = len(grid) dp = [[float('-inf')]*N for _ in range(N)] dp[0][0] = grid[0][0] for t in range(1,2*N-1): dp2 = [[float('-inf')]*N for _ in range(N)] for i in range(max(0,t-(N-1)),min(N-1,t)+1): for j in range(max(0,t-(N-1)),min(N-1,t)+1): if grid[i][t-i] == -1 or grid[j][t-j]== -1: continue val = grid[i][t-i] dp = dp2 return max(0,dp[N-1][N-1])
标签: #python输出一个n阶的方阵