跳房子是小朋友玩的游戏。地面上画出一连串格子,每个格子里有一个整数,小朋友从外面跳入格子,并继续往前跳,直到跳出所有格子。每次跳跃的规则是,可以跳入下一格或下下格或下下下格。怎么跳能让落脚格子里的数的累加和最小。给出这题代码
时间: 2023-09-17 13:05:07 浏览: 289
cocoscreator 微信跳一跳
### 回答1:
这题可以使用动态规划来求解。
假设 $dp[i]$ 表示从第 $i$ 个格子出发到跳完所有格子所得到的最小累加和。那么状态转移方程为:
$$dp[i] = a_i + \min(dp[i+1], dp[i+2], dp[i+3]), i \in [1, n-3]$$
其中 $a_i$ 表示第 $i$ 个格子里的整数。注意到当 $i \geq n-2$ 时,只能跳到最后一个格子,因此有:
$$dp[n-2] = a_{n-2} + \min(dp[n-1], dp[n])$$
$$dp[n-1] = a_{n-1} + dp[n]$$
最终的答案即为 $dp[1]$。
下面是实现的代码:
### 回答2:
这是一个典型的动态规划问题。我们可以定义一个数组dp,dp[i]表示跳到第i个格子时的最小累加和。
根据题目要求,每次跳跃的规则是可以跳入下一格或下下格或下下下格,所以第i个格子的最小累加和是由前面三个格子的最小累加和与第i个格子的数值决定的。即:dp[i] = min(dp[i-1], dp[i-2], dp[i-3]) + grid[i],其中grid[i]表示第i个格子里的数值。
根据上述递推关系,我们可以依次计算出dp[0]、dp[1]、dp[2]、...、dp[n-1]的最小累加和,其中n为格子的总数。最终答案就是dp[n-1]。
下面是题目的代码实现:
```python
def getMinSum(grid):
n = len(grid)
dp = [0] * n
dp[0] = grid[0]
dp[1] = grid[1]
dp[2] = grid[2]
for i in range(3, n):
dp[i] = min(dp[i-1], dp[i-2], dp[i-3]) + grid[i]
return dp[n-1]
grid = [1, 2, 3, 4, 5, 6, 7, 8, 9]
print(getMinSum(grid))
```
以上代码使用Python语言实现了题目的逻辑。对于给定的格子数及每个格子里的数值,函数`getMinSum`会计算出跳房子的最小累加和并返回结果。在示例中,问号代表的格子数值是需要计算的,我们可以根据题目要求按顺序填上数值,最终输出最小累加和。
请注意,以上代码仅为示例,实际应用中可能需要根据具体情况进行修改和调整,但整体思路和递推关系不变。
### 回答3:
该问题可以使用动态规划来解决。假设地面上一共有 n 个格子,每个格子里的整数分别为 a1, a2, ..., an。定义 dp[i] 为从第 i 个格子开始跳跃到最后一个格子所得到的最小累加和。
状态转移方程为 dp[i] = min(dp[i+1], dp[i+2], dp[i+3]) + ai。
根据状态转移方程,可以从后往前计算 dp[i] 的值。最后返回 dp[1] 即可。
以下是代码实现:
```python
def calculateMinSum(nums):
n = len(nums)
dp = [0] * (n + 1)
for i in range(n-1, 0, -1):
dp[i] = min(dp[i+1], dp[i+2], dp[i+3]) + nums[i]
return dp[1]
# 测试代码
nums = [3, 5, 2, 1, 7, 8, 4]
minSum = calculateMinSum(nums)
print(minSum)
```
运行结果为:
```
16
```
说明从第一个格子跳到最后一个格子的最小累加和为 16。
阅读全文