题目要求:
阿里笔试前的编程测验题,具体的题目要求很长,我已经给忘记了,大概意思就是,给你一个由0和1组成的矩阵,例如下面这个矩阵:
maps = [[1, 1, 0, 1, 1, 0, 0], [1, 0, 1, 1, 0, 0, 1], [1, 1, 1, 1, 1, 1, 1], [0, 1, 0, 1, 0, 1, 1], [1, 0, 1, 1, 1, 1, 0], [1, 1, 0, 1, 1, 0, 1]]
让你选择一个位置,这个位置必须是1,而且从这个位置出发(上,下,左,右)可以打到飞机数最多,1代表飞机,0代表陨石(不可到达),输出的结果要求是一个坐标信息,如果存在相同的结果,应该都输出出来。
题目分析:
很显然,使用暴力解法时间复杂度为O(n3), 在这里采用动态规划思想,时间复杂度为O(n2),从上下左右四个方向出发,分别代表一个单维的数组进行dp操作。
Python3 实现:
# @Time :2018/5/8 # @Author :LiuYinxing maps = [[1, 1, 0, 1, 1, 0, 0], [1, 0, 1, 1, 0, 0, 1], [1, 1, 1, 1, 1, 1, 1], [0, 1, 0, 1, 0, 1, 1], [1, 0, 1, 1, 1, 1, 0], [1, 1, 0, 1, 1, 0, 1]] n, m = 6, 7 # 行列 dp1 = [[0]*m for _ in range(n)] # 上 dp2 = [[0]*m for _ in range(n)] # 右 dp3 = [[0]*m for _ in range(n)] # 下 dp4 = [[0]*m for _ in range(n)] # 左 for i in range(m): dp1[0][i], dp3[n-1][i] = maps[0][i], maps[n-1][i] # 初始化 for i in range(n): dp2[i][m-1], dp4[i][0] = maps[i][m-1], maps[i][0] for i in range(n): # 从左--->右计算 for j in range(1, m): dp4[i][j] = 0 if maps[i][j] == 0 else dp4[i][j-1] + maps[i][j] for i in range(n): # 从右--->左计算 for j in range(m-2, -1, -1): dp2[i][j] = 0 if maps[i][j] == 0 else dp2[i][j+1] + maps[i][j] for j in range(m): # 从上--->下计算 for i in range(1, n): dp1[i][j] = 0 if maps[i][j] == 0 else dp1[i-1][j] + maps[i][j] for j in range(m): # 从下--->上计算 for i in range(n-2, -1, -1): dp3[i][j] = 0 if maps[i][j] == 0 else dp3[i+1][j] + maps[i][j] idm = 0 pathid = [] for i in range(n): # 获取结果 for j in range(m): dp1[i][j] = dp1[i][j] + dp2[i][j] + dp3[i][j] + dp4[i][j] - (3*maps[i][j]) if dp1[i][j] > idm: # 更新最大值 idm, pathid= dp1[i][j], [[i,j]] elif dp1[i][j] == idm: # 保留最大值 pathid.append([i,j]) print(pathid)
程序简化一下:
# @Time :2018/5/8 # @Author :LiuYinxing maps = [[1, 1, 0, 1, 1, 0, 0], [1, 0, 1, 1, 0, 0, 1], [1, 1, 1, 1, 1, 1, 1], [0, 1, 0, 1, 0, 1, 1], [1, 0, 1, 1, 1, 1, 0], [1, 1, 0, 1, 1, 0, 1]] n, m = 6, 7 # 行列 dp1 = [[0]*m for _ in range(n)] # 上 dp2 = [[0]*m for _ in range(n)] # 右 dp3 = [[0]*m for _ in range(n)] # 下 dp4 = [[0]*m for _ in range(n)] # 左 for i in range(m): dp1[0][i], dp3[n-1][i] = maps[0][i], maps[n-1][i] # 初始化 for i in range(n): dp2[i][m-1], dp4[i][0] = maps[i][m-1], maps[i][0] for i in range(n): # 一行一行的计算 for j in range(1, m): # 从左--->右计算 dp4[i][j] = [0, dp4[i][j-1] + maps[i][j]][maps[i][j]] for j in range(m-2, -1, -1): # 从右--->左计算 dp2[i][j] = [0, dp2[i][j+1] + maps[i][j]][maps[i][j]] for j in range(m): # 一列一列的计算 for i in range(1, n): # 从上--->下计算 dp1[i][j] = [0, dp1[i-1][j] + maps[i][j]][maps[i][j]] for i in range(n-2, -1, -1): # 从下--->上计算 dp3[i][j] = [0, dp3[i+1][j] + maps[i][j]][maps[i][j]] idm = 0 pathid = [] for i in range(n): # 获取结果 for j in range(m): dp1[i][j] = dp1[i][j] + dp2[i][j] + dp3[i][j] + dp4[i][j] - (3*maps[i][j]) if dp1[i][j] > idm: # 更新最大值 idm, pathid= dp1[i][j], [[i,j]] elif dp1[i][j] == idm: # 保留最大值 pathid.append([i,j]) print(pathid)
发现问题,可以留言指教哦。小白一个。