dp-动态规划(DP)算法求出一个问题的所有解

问题描述

动态规划(DP)算法求出一个问题的所有解

具体问题是:
假设有一个楼梯共有N步,你每次可以爬1步或2步。请编写一个函数来计算,有多少种不同的方法可以爬到顶。
此题给出的解如下:

 int climbStaris(int n){
    if(n <= 1) return 1;
    if(n == 2) return 2;

    int p = 1, q = 2, curr;
    for( int i = 3; i <= n; ++i){
        curr = p + q;
        p = q;
        q = curr;
    }
    return curr;
}

我不是很懂这个for循环意思,为什么进行了这样的循环操作,就能得到这道题的所有解?这里面用到了动态规划吗,哪里体现出来了。

解决方案

如果有1层,那么有1种走法(p)
如果有2层,那么有2种走法(q)
如果有3层,有2个分支,一个先到1层,再到3层,一个是先到2层再到3层,所以是curr = p + q
我们让p始终表示i - 2层,q始终表示i - 1层
因此新的p就是原来的q,新的q就是原来的curr
因此可以知道,对于第i层,肯定是第n-2的方法数(p)+到第n-1的方法数(q)

这个算法无非就是把递归强行写成循环,没什么动态规划。

解决方案二:

因此可以知道,对于第i层,肯定是第n-2的方法数(p)+到第n-1的方法数(q)
->
因此可以知道,对于第i层,肯定是第i-2的方法数(p)+到第i-1的方法数(q)

时间: 2024-11-01 23:02:40

dp-动态规划(DP)算法求出一个问题的所有解的相关文章

软件技术 提问 假设用邻接矩阵储存无向图 设计算法 求出度数最大的顶点编号 谢谢

问题描述 软件技术 提问 假设用邻接矩阵储存无向图 设计算法 求出度数最大的顶点编号 谢谢 假设用邻接矩阵储存无向图 设计算法 求出度数最大的顶点编号 急求帮助 解决方案 int degreel(Graph & ga,int numb) { int j,d=0: for (j=0:j<ga.vexnunl:j++) if (ga.cost[numb][j]!=0 && ga.cost[numb][j]!=MAXINT) d++: return(d): } 解决方案二: 自己补

贪心算法-找出一个-1,0,1三值矩阵中的最大全1子块

问题描述 找出一个-1,0,1三值矩阵中的最大全1子块 并不要求子块仍为一个矩阵,但要求形状为凸多边形,可进行行列变换,只要求所求子块最大. 我的理解是:用贪心法找出一个连续的最全1块,再进行行列变换保证子块形状为凸. 数据量较大,文件形式给出.

求出一个排序二叉树中结点度数为一的结点个数

#include<stdio.h> #include<iostream.h> #include<conio.h> #include<malloc.h> #include<stdlib.h> #define ERROR 0 #define STACK_INIT_SIZE 100 #define OVERFLOW -1 #define FALSE 0 #define TRUE 1 #define OK 1 int i=0;   struct  tre

JS实现求出一个字符串中最多出现的字符和个数_javascript技巧

[Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]

算法题。给出一推点的坐标,和入口点,结束点,求出最短路径

问题描述 打个比方,我要去北京,有好多景点,比如A,B,C,D,E,F,每个点都有坐标,1:假设从A开始,D结束,求出一个路线最短的方案.2:假设从A开始,结束点任意,求出一个路线最短的方案. 解决方案 解决方案二:动态规划~我猜是这个.解决方案三:这第一个问题和第二个问题有区别吗,简直一模一样两点间直线距离最短,做一个排序,哪个最短去那个解决方案四:假如说从交通大学出发,天坛公园结束,要走完每一个其他景点,求最短路径.这不是经典的最短路径的题,也不是图的遍历,反正我也不懂,求大神帮忙解决方案五

设计-类似最小生成树的算法求解答

问题描述 类似最小生成树的算法求解答 输入一些二元组,二元组代表连通的两个节点.所有的二元组构成一个无向图.现在请你设计一个算法,求出一个最小生成树,使得图中没有回路,并且连接所有节点.输出的数据也用二元组表达. 要用Java或者C#来实现. 解决方案 http://bbs.csdn.net/topics/380240225 解决方案二: 参考我写的迷宫程序,本质上这就是用的最小生成树.

求给出一个生成n个和为1,且每个数都在[0,1]间的随机数的算法

问题描述 求给出一个生成n个和为1,且每个数都在[0,1]间的随机数的算法 同题,有伪码就好了,或者其他什么代码都可以.要求生成的随机数分布不会有明显的集中,比如最后几个随机数总是近似为零 解决方案 这不很简单吗. 理论上:先生成n个随机数,求总和得S,每个数都除以S,就保证和为1. 实现上: 1)除之前先判断一下S是否为0(随机算法太妖了吧),是0就重来. 2)考虑到小数的精度问题,最后一个数修正为 1-(前n-1个数的和). 解决方案二: 这个简单,产生n个0~1的随机数,相加,然后得到一个

求解答-试编写一个算法,找出一个循环链表中的最小值。我是新手,编了一个程序,不知错在哪

问题描述 试编写一个算法,找出一个循环链表中的最小值.我是新手,编了一个程序,不知错在哪 #includeusing namespace std; class LinkNode{ int data; LinkNode *link; LinkNode(int d=0LinkNode *l=0){data=d;link=l;}}; class List{private: LinkNode *first; int n;public: List() { first=new LinkNode; first

动态规划(DP)入门

零.先修课程 首先,在开始理解DP的思想前,你需要 1. 完成HDU里面的递推求解专题练习(For Beginner)那7道题(这些题很简单,题解请在博客中搜索),这对你理解DP有很大的帮助. 2. 对递归搜索(比如深度优先搜索,DFS)有一定了解. 一.递归与记忆化搜索 我们从POJ 3176入手来学习这一思想.(题目很短,请快速读完) 从上往下看,最大和值无非是往左走和往右走这两条路的较大者.这样,我们可以写出下面这个重要的递归函数:(这里i表示行,j表示列) int f(int i, in