zoukankan      html  css  js  c++  java
  • 动态规划-爬楼梯问题

    其实我一直分不清楚动态规划和分治,递归之间的区别与联系。。。<( ̄3 ̄)> 三者之间应该是有点关系的吧

    网上说:

    1. 什么是动态规划?
             和分治法一样,动态规划(dynamicprogramming)是通过组合子问题而解决整个问题的解。
             分治法是将问题划分成一些独立的子问题,递归地求解各子问题,然后合并子问题的解。
             动态规划适用于子问题不是独立的情况,也就是各子问题包含公共的子子问题。
             此时,分治法会做许多不必要的工作,即重复地求解公共的子问题。动态规划算法对每个子问题只求解一次,将其结果保存起来,从而避免每次遇到各个子问题时重新计算答            案。
    2. 动态规划算法的设计
    两种方法:
             自顶向下(又称记忆化搜索、备忘录):基本上对应着递归函数实现,从大范围开始计算,要注意不断保存中间结果,避免重复计算
             自底向上(递推):从小范围递推计算到大范围
    动态规划的重点:
             递归方程+边界条件.

    例题: 一个人每次只能走一层楼梯或者两层楼梯,问走到第80层楼梯一共有多少种方法。

    第一次提交,我的答案:说是时间超出限制了。。。。。实际上看我写的,是一种函数的递归调用,算法书上(李清勇)对函数的递归调用谈到了一个重叠子问题,修改方法就是先用数组将前面的计算结果存储起来。要用的时候直接拿出来用就行。

    public class Solution {
    public int climbStairs(int n) {

    if(n==1)
    return 1;
    else if(n==2)
    return 2;
    else
    return climbStairs(n-1)+climbStairs(n-2);
    }
    }

    修改:

    public int climbStairs(int n) {
        	if (n == 0 || n == 1 || n == 2) {
        		return n;
        	}
            int[] r = new int[n+1];
            r[1] = 1;
            r[2] = 2;
            for (int i = 3; i <= n; i++) {
            	r[i] = r[i-1] + r[i-2];
            }
            return r[n];
        }
  • 相关阅读:
    面向对象-继承
    antd pro2.0 使用记录一:登录/注册/底部版权等设置
    vscode中git的配置
    电脑桌面文件夹出现在屏幕之外了,怎么解决
    百度网盘不限速-Motrix
    u盘在电脑读不出来,但别的可以读
    win10 命令重置 管理员密码
    nginx 配置
    react 记录:运行npm run eject命令暴露配置文件都报这个错误
    浏览器 连不上网 (3):DNS 服务器问题
  • 原文地址:https://www.cnblogs.com/maowuyu-xb/p/6166106.html
Copyright © 2011-2022 走看看