You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改贪心算法以求解该棋盘游戏可获得的最高总得分

解法思路

这个问题是典型的线性动态规划适用场景,不需要暴力遍历所有路径,也不需要存储全量图结构,时间和空间复杂度都能满足最大棋盘规模的要求。

状态定义

我们定义两个数组:

  • max_score[i]:走到第i个格子时能拿到的最高总得分
  • min_step[i]:拿到max_score[i]对应的最少步数

状态转移

对于第i个格子,你最多可以从它前面的6个格子走过来(i-1到i-6,不小于起点索引即可),所以状态转移逻辑为:

  1. 先找到[max(i-6, 0), i-1]区间内max_score的最大值prev_max
  2. max_score[i] = 当前格子积分 + prev_max
  3. 找到所有能达到prev_max的前置格子,取其中最小的min_step加1,就是min_step[i]的值

边界条件

起点(第0个格子)的初始值:

  • max_score[0] = 第一个格子的积分
  • min_step[0] = 0(起点不需要走步数)

优化方案

如果直接每次遍历前6个元素找最大值,时间复杂度是O(6n),就算n是1e5也完全能跑通。如果要进一步优化,可以用单调队列维护滑动窗口的最大值,把时间复杂度降到严格的O(n),内存占用仅为O(n),完全不会出现你担心的内存爆炸问题。

反例验证

针对你给出的积分数组[1, -40, -40, -40, -40, -1, -38, -40, -40, -40, -40, -40, 1](共13个格子,终点是索引12):

  • 走到索引6(值为-38的格子)的最高得分是1 + (-38) = -37,步数为2
  • 走到索引5(值为-1的格子)的最高得分是1 + (-1) = 0,步数为1
  • 走到终点索引12时,可从索引6(得分-37 +1 = -36,步数2+1=3)、索引5(得分0 + (-38) +1 = -37,步数1+2=3),所以最终最高得分是-36,对应步数3,和最优结果完全一致。

示例代码(Python)

def get_min_step_with_max_score(scores):
    n = len(scores)
    if n == 0:
        return 0
    max_score = [float('-inf')] * n
    min_step = [float('inf')] * n
    max_score[0] = scores[0]
    min_step[0] = 0
    for i in range(1, n):
        start = max(0, i-6)
        prev_max = float('-inf')
        prev_min_step = float('inf')
        # 遍历前最多6个格子找最优前置状态
        for j in range(start, i):
            if max_score[j] > prev_max:
                prev_max = max_score[j]
                prev_min_step = min_step[j]
            elif max_score[j] == prev_max:
                prev_min_step = min(prev_min_step, min_step[j])
        max_score[i] = scores[i] + prev_max
        min_step[i] = prev_min_step + 1
    return min_step[-1]

# 测试示例
scores = [1, -40, -40, -40, -40, -1, -38, -40, -40, -40, -40, -40, 1]
print(get_min_step_with_max_score(scores)) # 输出3,符合预期

内容的提问来源于stack exchange,提问作者FilthyProgrammer96

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 18:54:01