机器人走方格(初识递归和动态规划)

题目

有一个X * Y的网格,机器人只能走方格而且每一步只能向右或向下走求机器人从左上角走到右下角一共有多少种走法

思路在这里插入图片描述

如图是一个3 * 3的网格,机器人从左上角出发,向右走则以后要走的是3 * 2的网格,往下走则以后要走的是2 * 3方格的方格
由此可得递推公式为:
f(x, y) = f(x, y - 1) + f(x - 1, y)
当网格只有一行或者一列时,只有一种走法
则递归的出口为x == 1 或 y == 1

动态规划:
根据递归改写为动态规划
递归的可变参数有两个,用二维数组保存每一步的数据
当x == 1 || y == 1时,array[x][y] = 1
否则array[x][y] = array[x - 1][y] + array[x][y - 1]

代码

在这里插入代码片/*
 * 有一个X * Y的网格,机器人只能走方格而且每一步只能向右或向下走
 * 求机器人从左上角走到右下角一共有多少种走法
 */
public class Robot {
   
	public static void main(String[] args) {
   
		int</
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面我将分别给出递归和动态规划的解法,并使用 Python 代码来实现。 01背包问题是一个经典的动态规划问题,其表述如下:有一个背包,容量为C,有n个物品,每个物品有重量w和价值v,现在要把这些物品放入背包中,使得背包中物品的总价值最大,求最大价值。 1. 递归解法 递归解法比较简单,但是由于存在大量的重复计算,效率比较低。具体思路是:对于每个物品,有两种选择,放入背包或不放入背包,然后递归处理剩下的物品。 代码如下: ```python def knapsack01_recursion(C, w, v, n): if n == 0 or C == 0: return 0 if w[n-1] > C: return knapsack01_recursion(C, w, v, n-1) else: return max(v[n-1] + knapsack01_recursion(C-w[n-1], w, v, n-1), knapsack01_recursion(C, w, v, n-1)) ``` 2. 动态规划解法 动态规划解法使用一个二维数组来存储中间状态,具体思路是:定义一个二维数组dp[i][j],表示前i个物品放入容量为j的背包中可以获得的最大价值。对于每个物品,有两种选择,放入背包或不放入背包,状态转移方程为: dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i-1]]+v[i-1]),其中w[i-1]和v[i-1]分别表示第i个物品的重量和价值。 最终的结果为dp[n][C]。 代码如下: ```python def knapsack01_dp(C, w, v, n): dp = [[0 for _ in range(C+1)] for _ in range(n+1)] for i in range(1, n+1): for j in range(1, C+1): if w[i-1] > j: dp[i][j] = dp[i-1][j] else: dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i-1]]+v[i-1]) return dp[n][C] ``` 以上就是使用递归和动态规划解决01背包问题的Python代码实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值