一个算法小白对动态规划的自我安慰似的理解

本文通过实例介绍了动态规划的概念,从经典的兔子数列问题出发,探讨了动态规划在解决组合问题中的应用,如使用不同面值的钞票凑出特定金额。文章讲解了动态规划中的无后效性,并通过硬币问题进一步阐述了如何建立状态转移方程,强调了动态规划的最优子结构和子问题重叠性质。
摘要由CSDN通过智能技术生成
前段时间刷了一阵子leetcode,除了一些比较常见的对数据的处理,最多的就是关于动态规划了,可能是经过这些题目对我的摧残,在看到刷到一道题中下面这个评论,于是我决定对它下手了,如果你也有同样经历,那么我们一起对它下手

在这里插入图片描述

首先我们先看这么一个题目:

在这里插入图片描述

问号是填 “2” 对吧 。OK,我们继续:

在这里插入图片描述

答案也很明了,记住你的答案,那么现在我们直接看下“维基百科”里面对动态规划的概述:

在这里插入图片描述

现在想想 “X” 和 “2” 是否符合上面红色文字描述,如果我们每次算一个 “ 2 + 3 ” 都要从 “1 + 1 = 2 ,1 + 1 + 1 = 3 ,1 + 1 + 1 + 1 + 1 = 5”会不会显得有些过于过于过于麻烦。。然后我们直接开始上实例证实一下:

在这里插入图片描述

非常常见的一个题目,“兔子数列”,求 第 “n” 个数值为多少?相信已经接触到动态规划的同学对这个应该不陌生,那么我们知道规律(算法公式)为:

在这里插入图片描述

这里我们直接上代码首先用常见的“递归”方式直接解出来:
public static int fib(int n){
    
	// 2 以下都是 1    
	if( n <= 2 )
	    return 1;         
	else  
	    return fib( n-1 ) + fib( n-2 ); 
}
然后代码就非常简洁,然后如果你跑个fib(100), 然后就会发现非常致命,这栈压得亚于突然重跑了一个项目。

在这里插入图片描述

现在我们换一种思路,就像你算 “2 + 3 = 5” 一样,你是直接使用得 “2” 和 “3” ,这里的数列中第5个值也是 “5” ,那么为什么我们不将“2” 和 “3” 保存起来,直接调用计算呢?直接上代码:
public static long fib_dp(int n){
   

     long[] dp = new long[n + 1];

     for(int i 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值