小东所在公司要发年终奖,而小东恰好获得了最高福利,他要在公司年会上参与一个抽奖游戏,游戏在一个6*6的棋盘上进行,上面放着36个价值不等的礼物,每个小的棋盘上面放置着一个礼物,他需要从左上角开始游戏,每次只能向下或者向右移动一步,到达右下角停止,一路上的格子里的礼物小东都能拿到,请设计一个算法使小东拿到价值最高的礼物。
给定一个6*6的矩阵board,其中每个元素为对应格子的礼物价值,左上角为[0,0],请返回能获得的最大价值,保证每个礼物价值大于100小于1000。
小东所在公司要发年终奖,而小东恰好获得了最高福利,他要在公司年会上参与一个抽奖游戏,游戏在一个6*6的棋盘上进行,上面放着36个价值不等的礼物,每个小的棋盘上面放置着一个礼物,他需要从左上角开始游戏,每次只能向下或者向右移动一步,到达右下角停止,一路上的格子里的礼物小东都能拿到,请设计一个算法使小东拿到价值最高的礼物。
给定一个6*6的矩阵board,其中每个元素为对应格子的礼物价值,左上角为[0,0],请返回能获得的最大价值,保证每个礼物价值大于100小于1000。
class Bonus: def getMost(self, board): # write code here if not board&nbs***bsp;len(board) == 0&nbs***bsp;len(board[0]) == 0: return 0 rows = len(board) cols = len(board[0]) dp = [[0] * cols for _ in range(rows)] dp[0][0] = board[0][0] for i in range(1, rows): dp[i][0] = dp[i - 1][0] + board[i][0] for j in range(1, cols): dp[0][j] = dp[0][j - 1] + board[0][j] for row in range(1, rows): for col in range(1, cols): dp[row][col] = max(dp[row - 1][col], dp[row][col - 1]) + board[row][col] return dp[-1][-1]
class Bonus: def getMost(self, board): # write code here m = len(board[0]) n = len(board) for i in range(1,m): board[0][i] += board[0][i-1] for j in range(1, n): board[j][0] += board[j-1][0] for i in range(1, m): for j in range(1, n): board[j][i] += max(board[j-1][i],board[j][i-1]) return board[n-1][m-1]
# -*- coding:utf-8 -*- class Bonus: def getMost(self,board): # write code here dp=[] for i in range(6): dp.append([0]*6) dp[0][0]=board[0][0] for i in range(1,6): dp[0][i]=dp[0][i-1]+board[0][i] for i in range(1,6): dp[i][0]=dp[i-1][0]+board[i][0] for i in range(1,6): for j in range(1,6): dp[i][j]=max(dp[i-1][j]+board[i][j],dp[i][j-1]+board[i][j]) return dp[-1][-1]
class Bonus: def getMost(self, board): #递归实现 maxValue = [0] #python2没有nonlocal关键词,就使用可变的对象list def pathCross(nowValue,i,j): if i == j == 5: maxValue[0] = max(nowValue+board[i][j],maxValue[0]) else: if i+1 < 6: pathCross(nowValue+board[i][j],i+1,j) if j+1 < 6: pathCross(nowValue+board[i][j],i,j+1) pathCross(0,0,0) return maxValue[0]
动态规划。 求解每一步的最优,该步的最有取决于该位置上面或左边的值。先计算第一行和第一列, 第一行每步只能向右,第一列每步只能向下。 创建一个新的6*6矩阵存储到达该步的最优解。 class Bonus: def getMost(self, board): got = [[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0]] got[0][0] = board[0][0] for i in range(1,6): #calculate the 1st row got[0][i] = got[0][i-1] + board[0][i] for i in range(1 ,6): #calculate the 1st column got[i][0] = got[i-1][0] + board[i][0] for i in range(1,6): for j in range(1,6): if got[i][j-1] > got[i-1][j]: got[i][j] = board[i][j] + got[i][j-1] else: got[i][j] = board[i][j] + got[i-1][j] return got[5][5]