算法学习(十)动态规划!!!

一、动态规划的思想

1.先上一波官方解读提提神:
动态规划(英语:Dynamic programming,简称DP)是一种在数学、管理科学、计算机科学、经济学和生物信息学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。 
动态规划常常适用于有重叠子问题最优子结构性质的问题。

官方术语太多?不能理解?what are you fucking say???? :)



往下看,我的理解也许能够帮助到你~~~

请记住上文划线的关键词,后面将会结合例子回顾讲解哦。

|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

2.举个栗子

我们先来看一个最简单的问题:求第n个斐波那契数列的值(不清楚概念的同学可以自行百度,点击可以看到我的解法)

最简单的解法就是递归求解啦
 

  private int Fib(int n){
        if(n<1 )return 0;
        if(n==1)return 1;
        return Fib(n-2)+Fib(n-1);
    }

但是这样的解法会有什么问题呢?——我们看下面的图(简单列出斐波拉契前5个数的求解树形图)

按照递归的思路往下走:
F(X)=F(X-1)+F(X-2)...

F(X-1)=F((X-1)-1)+F((X-1)-2)...

F(X-2)=F((X-2)-1)+F((X-2)-2)...

直至走到底,好像一切都很顺利:)

?诶?不对呀,

F(X-2)=3   ==  F((X-1)-1)=3

F((x-1)-2)=2  ==  F((x-2)-1)=2  ==  F(((x-1)-1)-1)=2

.............................再往下1?0?将会出现无数次重复计算

这!就是传说中的——————————

重叠子问题!!!!!!


如何解决重叠子问题呢?
很简单,按照正常的思维也能想到~
不就是一个问题重复计算嘛?我找个容器把它存储起来,等要用的使用直接对应下标取出不就好了吗?
这样就避免了,顶层问题重复递归到最底层(本题中即到达0或者1的深度)求解造成的栈溢出问题
(为什么会栈溢出?:)你可以用一个50左右的数看看指数级增长曲线有多美,嘻嘻)

于是,我的第二种解法来了:

public class Solution {
    public int Fibonacci(int n) {
        int[]fib=new int[n+1];
        fib[0]=0;
        if(n>0)fib[1]=1;
        
        for(int i=2;i<=n;i++){
           fib[i]=fib[i-1]+fib[i-2];
        }
        
        return fib[n];
}

——》分析代码可以知道,fib[ ]就是我的容器

我从零搭建起这个容器,逐步往高层搭建的过程中,重复需要的f(x-1)或者f(x-2)就可以直接从容器中取,而不需要重新底层累加。

是不是很简单?

|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

至此,我们解释了重叠子问题,并初步使用动态规划解决了斐波那契数列带来的重复计算问题,相信大家已经对动态规划有了一个初步入门的认识。

下一部分我将结合动态规划的经典问题:01背包问题解释最优子结构的概念,并加深大家对动态规划的理解。(  :

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

IMUHERO

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

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

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

打赏作者

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

抵扣说明:

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

余额充值