如何将暴力递归改为动态规划?

暴力递归

1、把问题转化为规模缩小了的同类问题的子问题
2、有明确的不需要继续进行递归的终止条件
3、有当得到了子问题的结果之后的决策过程
4、不需要记录每一个子问题的解

动态规划

1、从暴力递归中来
2、将每一个子问题的解记录下来,避免重复计算(这是动态规划优于递归的本质原因)
3、把暴力递归的过程,抽象成了状态表达
4、并且存在化简状态表达,使其更加简洁的可能

开胃小菜,先来一道题感受一下如何暴力递归:

打印一个字符串的全部子序列,包括空字符串
例如abc的全部子序列为a,b,c,ab,bc,ac,abc和空字符串(注意子序列和子串的区别,子序列可以不连续,子串必须连续,前者去掉ac就是子串)。
暴力递归思路:还是以abc为例
对于每个位置,都有要和不要两种选择,穷尽所有位置即可得到答案,如下图
在这里插入图片描述

public static void printAllSubsquence(String str) {
   
		char[] chs = str.toCharArray();
		String res = "";
		process(chs, 0, res);
	}

	public static void process(char[] str, int i,String res) {
   
		if (i == str.length) {
   //终止条件,当i到达最后一个位置后打印结果
			System.out.println(res);
			return;
		}
		process(str, i + 1, res);//不要当前位置的值
		process(str, i + 1, res+String.valueOf(str[i]));//要当前位置的值		
	}

运行结果(第一行是空串):
在这里插入图片描述

进入正题

给你一个二维数组,数组中的每一个数都是正数,要求从左上角走到右下角,每一步只能向右或者向下,沿途经过的数字要累加起来,返回最小的路径和。
举个例子,
1, 3, 0
2, 5, 1
7, 4, 2
很显然最小路径和=1+3+0+1+2=7

  • 遇到这种题,首先我们应该先尝试写出它的暴力递归解法(最重要的一步)
  • 其次再考虑改成动态规划

分析一下暴力递归的思路:
情况(1):当前点(i,j)来到最后一列,此时只能向下走,即走到(i+1,j)
情况(2):当前点(i,j)来到最后一行,此时只能向右走,即走到(i,j+1)
情况(3):普遍情况,当前点可以选择向右或者向下,选择其中路径和较小的一个

有了思路,代码不一会儿就刷刷刷的写好了

	public static int minPath1(int[][</
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值