走格子问题 python代码

本文介绍了一种计算机器人在M乘N网格中从左上角到右下角的不同路径数量的算法。通过两种方法实现:递归解法,直接但效率较低;动态规划解法,避免重复计算,提高效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有一个M乘N的网格,一个机器人只能走格点且只能向右或向下走,要从左上角走到右下角。请设计一个算法,计算机器人有多少种走法。

递归解法

def countWays(x, y):
    if(x == 1 or y == 1):
        return 1
    return countWays(x - 1, y) + countWays(x, y - 1)
    
print(countWays(4,4))    

动态规划解法

def countWays2(x, y):
    dp = []
    for i in range(4):
        dp.append([0]*4)

    for i in range(x):
        dp[i][0] = 1
    for i in range(y):
        dp[0][i] = 1

    for i in range(1,x):
        for j in range(1,y):
            dp[i][j] = dp[i][j - 1] + dp[i - 1][j]

    return dp[x - 1][y - 1]

print(countWays2(4,4))

dp存的到达每个位置的走法数

### 小明格子问题Python 解决方案 以下是基于动态规划方法解决“小明格子问题的一个完整实现。此代码综合考虑了输入输出的要求以及不连续跳跃的约束条件。 #### 动态规划核心逻辑 通过定义 `dp` 数组来存储到达每个位置的最大得分,其中 `dp[i]` 表示跳到第 `i` 个格子时所能获得的最大分数。为了防止连续跳跃,需遍历前 `k` 步中的最大值并更新当前状态[^1]。 ```python def max_score(nums, k): n = len(nums) if n == 0: return 0 elif n == 1: return nums[0] dp = [0] * n dp[0] = nums[0] for i in range(1, n): max_val = float('-inf') for j in range(1, min(k + 1, i + 1)): # 防止越界访问 if i - j >= 0: max_val = max(max_val, dp[i - j]) dp[i] = max_val + nums[i] if max_val != float('-inf') else nums[i] return max(dp) # 输入处理部分 if __name__ == "__main__": n = int(input()) scores = list(map(int, input().split())) k = int(input()) result = max_score(scores, k) print(result) ``` #### 示例运行说明 对于给定样例: **输入** ``` 6 1 -1 -6 7 -17 7 2 ``` **执行流程分析** - 初始化 `dp` 数组为 `[0]*n` 并设置初始值。 - 对于每一个索引 `i`,查找其前面最多 `k` 个可能的状态中最大的值,并加上当前位置的分数。 - 返回整个 `dp` 数组中的最大值作为最终结果。 **输出** ``` 14 ``` 该程序实现了题目所描述的功能,并能正确处理边界情况和负分的情况[^4]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

-Love-Coding-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值