【Python】京东数据分析工程师笔试题
Q1:滚球游戏
思路:
动态规划,dp[i][j]表示走到第i层第j个位置的最大和。
注意边界情况的处理:
- 最左端点只能从右上端点滚动到达;
- 左端第二个点只能从上端点和右上端点滚动到达;
- 最右端点只能从左上端点滚动到达;
- 右端第二个点只能从上端点和左上端点滚动到达;
- 剩余点可以从左上,上,右上三个端点滚动到达。
n = int(input()) nums = [] for i in range(n): nums.append([int(x) for x in input().split()]) # dp[i][j]表示走到第i层第j个位置的最大和 dp = [[0 for _ in range(2*n-1)] for _ in range(n)] dp[0][n-1] = nums[0][0] for i in range(1,n): for j in range(n-i-1, n+i): if j==n-i-1: # 左端一点,只有右上点可到达 dp[i][j] = dp[i-1][j+1] + nums[i][0] elif j==n-i: # 左端二点,只有上和右上可到达 dp[i][j] = max(dp[i-1][j], dp[i-1][j+1]) + nums[i][1] elif j==n+i-1: # 右端一点,只有左上点可到达 dp[i][j] = dp[i-1][j-1] + nums[i][-1] elif j==n+i-2: # 右端二点,只有左上点可到达 dp[i][j] = max(dp[i-1][j-1], dp[i-1][j]) + nums[i][-2] else: dp[i][j] = max(dp[i-1][j-1], dp[i-1][j], dp[i-1][j+1]) + nums[i][j-(n-i-1)] print(max(dp[n-1]))
Q2:数据变换