动态规划法实验

一、实验目的

1 理解动态规划法的特征(多阶段决策\最优子结构\无后效性\子问题重复)

2 理解动态规划法的求解(划分过程\逆向推导\正向计算)

3 掌握动态规划法的简单实现(自顶向下递归备忘\自底向上迭代填表)和时间复杂度分析

二、实验内容

  1. 斐波那契数列 

(1)自底向上

  1. 自顶向下

2、走棋盘

爬台阶问题 

三、问题分析

       1、斐波那契数列

       (1)、自底而上:

       对于自底向上是一种迭代填表的办法,要利用一个一维数组来进行迭代,最后返回数组最后一个值即可

       (2)、自顶而下:

       对于自顶而下是一种利用备忘录的方法,就是利用一个数组“备忘录”,来把已经解决的问题存起来,下一次每次需要用到这个子问题的时候,直接在“备忘录”中查看即可,而不用重新操作

       2、走棋盘问题:

              因为每次都只能向右走或者向左走,所以走法总数 = 终点上方格子的走法总数 + 终点左边格子的走法总数,原问题的解包含子问题的解,依旧是利用迭代填表的方式,利用二维数组进行填表,然后最后返回这个二维数组最后一个值即可

       3、爬台阶问题:

              对于楼梯,每次都只能爬一阶或者二阶,爬到第n阶的方法数就会等于爬到第n-1阶的方法数加上爬到第n-2的方法数,依旧是利用迭代填表的方式dp[i]=dp[i−1]+dp[i−2]

只需要利用一维数组,最后返回这个数组的最后一个值即可

四、问题解决

       1、斐波那契数列

              (1)、自底而上:

       A、算法描述:int Fb1(int n)

              输入:斐波那契数列的第n项

              输出:返回斐波那契数列第n个数的值

              过程:1、先定义一个整形数组a[]

                       2、令a[0]=0;a[1]=1

                       3、循环变量i从2到n,重复执行以下操作:

                            3.1、a[i]=a[i-1]+a[i-2];

                            3.2、i++;

                       4、return a[n]

       B、代码:

      

该算法的时间复杂度为:O(n)

C、运行截图:

(2)、自顶而下:

       A、算法描述:int Fb2(int n)

              输入:斐波那契数列第n项      

              输出:斐波那契数列第n项的值

              过程:1、先定义一个一维整型数组a[]

                       2、如n==0,则a[0]=0,return a[0];

                       3、如n==1,则a[1]=1,return a[1];

                       4、如a[n]>=1,则return a[n];

                       5、a[n]=Fb2(n-1)+Fb2(n-2);

                       6、返回a[n]

       B、代码:

该算法的时间复杂度为:O(n)

2、走棋盘问题:

       (1)、算法描述:int uniquePaths(int [][]s,int m,int n)

              输入:二维数组s[][],棋盘行数m,列数n

              输出:总的走法数

              过程:1、定义循环变量i,j

                       2、循环变量i从0到m-1,重复执行以下操作:

                            2.1、s[i][0]=1

                       3、循环变量j从0到n-1,重复执行以下操作:

                            3.1、s[0][j]=1

                       4、循环变量i,j均从1开始,分别到达m-1和n-1

                            4.1、s[i][j]=s[i-1][j]+s[i]s[j-1];

                       5、返回s[i][j];

       (2)、代码:

该算法的时间复杂度为:O(n*m)

(3)、运行截图:

3、爬台阶问题:

       (1)、算法描述:int Solution(int n)

              输入:台阶数n

              输出:走法数

              过程:1、如n<=1,则返回1;

                       2、定义一个长度为n+1的整形数组dp[]

                       3、dp[1]=1;dp[2]=2

                       4、定义循环变量i从3到n,重复以下操作:

                            4.1、dp[i]=dp[i-1]+dp[i-2];

                            4.2、i++

                       5、返回dp[n]

       (2)、代码:

该算法时间复杂度为:O(n)

       (3)、运行截图:

五、实验结果总结

回答以下问题:

  1. 如果用分治函数实现斐波那契数列,该函数被调用几次? 而用自顶向下递归备忘实现时,该函数又被调用几次? 自底向上迭代填表时,又被调用几次?请你给出1个n的具体值,画图回答以上问题。
  2. 请从你实现的级别中选择一题,说明动态规划法的解决过程(划分阶段、逆向推导、正向计算),再针对实现说明是自底向上或是自顶向下。(例:级别为“中”,就从走棋盘或者找零钱中选择一道题来分析。)
  3. 你觉得动态规划法和分治法有区别吗?请举例说明。
  4. 动态规划法的两种实现有区别吗?你觉得动态规划法能解决所有问题吗?
  5. 到目前为止,在算法课程学习中有何问题?你对老师有何建议?

  • 25
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值