前段时间刷了一阵子leetcode,除了一些比较常见的对数据的处理,最多的就是关于动态规划了,可能是经过这些题目对我的摧残,在看到刷到一道题中下面这个评论,于是我决定对它下手了,如果你也有同样经历,那么我们一起对它下手
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/f8b3b51047789c08601d0ca71cf4f01f.png)
首先我们先看这么一个题目:
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/7f8fb60e03366858a576ca982ee31c78.png)
问号是填 “2” 对吧 。OK,我们继续:
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/c1107f2092ab48324c7e9e0ef3d3fd15.png)
答案也很明了,记住你的答案,那么现在我们直接看下“维基百科”里面对动态规划的概述:
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/aa7010169cea233a0f3462b3205bd548.png)
现在想想 “X” 和 “2” 是否符合上面红色文字描述,如果我们每次算一个 “ 2 + 3 ” 都要从 “1 + 1 = 2 ,1 + 1 + 1 = 3 ,1 + 1 + 1 + 1 + 1 = 5”会不会显得有些过于过于过于麻烦。。然后我们直接开始上实例证实一下:
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/c1d6e7941816041a67b459610265ec3a.png)
非常常见的一个题目,“兔子数列”,求 第 “n” 个数值为多少?相信已经接触到动态规划的同学对这个应该不陌生,那么我们知道规律(算法公式)为:
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/84c7e624f7d525b2bed223c963fe18be.png)
这里我们直接上代码首先用常见的“递归”方式直接解出来:
public static int fib(int n){
if( n <= 2 )
return 1;
else
return fib( n-1 ) + fib( n-2 );
}
然后代码就非常简洁,然后如果你跑个fib(100), 然后就会发现非常致命,这栈压得亚于突然重跑了一个项目。
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/579fe0f65e8e6e9da70e8431cf98e0fe.png)
现在我们换一种思路,就像你算 “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