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];
        }
  • 相关阅读:
    react ts axios 配置跨域
    npm run eject“Remove untracked files, stash or commit any changes, and try again.”错误
    java 进程的参数和list的线程安全
    帆软报表 大屏列表跑马灯效果JS
    帆软报表 快速复用数据集,避免重复劳动
    分析云 OA中部门分级思路和实现方法
    分析云 分段器 只显示一个块的数据
    分析云 更改服务默认的端口号
    分析云U8项目配置方法新版本(2)
    Oracle 创建时间维度表并更新是否工作日字段
  • 原文地址:https://www.cnblogs.com/maowuyu-xb/p/6166106.html
Copyright © 2011-2022 走看看