📅  最后修改于: 2023-12-03 15:28:48.737000             🧑  作者: Mango
该题目是一个典型的动态规划问题,可以通过以下步骤解决:
首先,我们要把题目转化为一个更易于处理的问题。在这个问题中,我们需要分别考虑左侧和右侧的门,以及究竟应该去哪个门。因此,我们可以定义一个dp[i][j]数组表示,在到达位置i之前,我们走过了j个门,其中0 <= i <= n,0 <= j <= k。
接着,我们需要确定dp数组中的初始状态和结束状态。在这个问题中,当我们还没有到达门的时候,我们就不能走进去,因此dp数组的初始状态应为dp[0][0] = 0,dp数组的结束状态应为dp[n][k],即我们走到了n位置,并且经过了k个门。
对于每个位置i和经过的门数j,我们需要判断我们应该往哪个门走。在这个问题中,我们有两种选择:往左门走或往右门走。因此,我们可以转移方程如下:
dp[i][j] = max(dp[i-1][j], dp[i-1][j-1]) + b[i][j]
其中,b[i][j]表示在位置i时,我们经过了第j个门的价值。
以下是完整的Python代码(其中,数组b和n,k需要根据题目输入进行定义):
n, k = map(int, input().split())
b = [list(map(int, input().split())) for _ in range(n)]
dp = [[0] * (k+1) for _ in range(n+1)]
for i in range(1, n+1):
for j in range(1, k+1):
dp[i][j] = max(dp[i-1][j], dp[i-1][j-1]) + b[i-1][j-1]
print(max(dp[n]))
以上是门|门CS 2008 |第85题的解题思路和代码。