1. 走台阶问题
有n级台阶,一个人每次上一级或者两级,问有多少种走完n级台阶的方法?
方法1:递归
#include <iostream>
using namespace std;const int N = 100; //假设最多走100级台阶
int result[N]; //保存结果int step(int n)
{
if(n > 2)
{
result
这里写目录标题1、动态规划算法2、动态规划&分治3、动态规划算法典型例题3.1选数问题3.1.1递归解法3.1.2动态规划解法3.2最长公共子序列3.3钢条切割问题3.3.1递归解法3.3.2动态规划解法3.4斐波那契数列3.4.1递归解法3.4.2递归解法3.5背包问题(0-1背包) 1、动态规划算法动态规划算法(Dynamic Programming),也叫dp算法,该算法的核心思想
目录1. 处理爬楼梯的问题2. 募捐基金问题3. 最小经费粉刷房子问题4. 篱笆粉刷方法数量问题5. 机器人在地图上的路径走法问题 6. 背包问题1. 处理爬楼梯的问题 设计climbstairs(n)进行处理,参数n代表n阶楼梯,每次可以爬1或2阶楼梯,得出有几种爬法可以爬上顶楼;d
1、三角数塔问题设有一个三角形的数塔,顶点为根结点,每个结点有一个整数值。从顶点出发,可以向左走或向右走,如图所示: 要求从根结点开始,请找出一条路径,使路径之和最大,只要输出路径的和。【代码】//// 例题1 三角数字塔问题 ////#include <stdio.h>#include <stdlib.h>#define MAXN 101int n,d[MAXN][M
转载
精选
2013-11-14 13:23:43
4414阅读
1.最长递增子序列求一段字符串的最长递增子序列问题分析:设序列为:A="a0,a1,a2,a3,a4,a5,...,ai",定义D(i)为选i作为序列一项后,后面序列中第i项更大项数有多少,包括i.从最后一项算起D(i)=1,依次往前计算;如果ak<=ak+1,则D(k)=D(k+1)+1 ; 如果ak>ak+1 ,则往后遍历,直到寻找到m,ak<=am,然后D(k)=D(m)+
买苹果Description小易去附近的商店买苹果,奸诈的商贩使用了捆绑交易,只提供 6 个每袋和 8 个每袋的包装(包装不可拆分)。 可是小易现在只想购买恰好 n 个苹果,小易想购买尽量少的袋数方便携带。如果不能购买恰好 n 个苹果,小易将不会购买。输入描述: 输入一个整数n,表示小易想购买 n(1 ≤ n ≤ 100) 个苹果输出描述: 输出一个整数表示最少需要购买的袋数,如果不能买恰好 n
目录一、三步问题二、连续数列三、打家劫舍四、不同路径五、最小路径和六、最长公共子序列 一、三步问题我们可以列出一个数组dp[n],在这个数组中的第i位保存的数据就是上i个楼梯有多少种走法,由此我们可以先得到:dp[1]=1; dp[2]=2; dp[3]=4;同时我们可以推出状态转移访方程为:dp[i]=(dp[i-1]+dp[i-2]+dp[i-3]) 代码如下:class Solution
力扣上比较简答的一道动态规划题目。 方程:class Solution {public: int uniquePaths(int m, int n) { const int M = m; const int N = n; int dp[M][N]; memset(dp, 0, sizeof(dp)); for (int i = 0; i < ...
原创
2021-06-05 00:09:47
763阅读
动态规划01介绍介绍:动态规划(dynamic programming)是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法。动态规划是求解某类问题的一种方法,是考察问题的一种途径,而不是一种特殊算法(如线性规划是一种算法)。因而,它不象线性规划那样有一个标准的数学表达式和明确定义的一组规则,而必须对具体问题进行具体分析处理。因此,在学习时,除了要对基本概念和方法
动态规划(dynamic programming)是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法。动态规划的难点就是思路:1、递归+记忆化 = 递推2、状态的定义:opt[n],dp[n]...3、状态转移方程:dp[n] = best_of(dp[n-1],dp[n-2],...)4、最优子结构动态规划 VS 回溯(递归) VS 贪心回溯(递归):重复计算
01 前言1.1 说明关于动态规划的见解:动规和递归有很多相似的地方,最显著的特征可以说是阶段性,二者都有很明显的阶段划分,所以,声明好每一个阶段所需要做的事情以及阶段与阶段之间的转移可以说是重中之重了,这就涉及几个问题:第一,需要声明好方法(递归)或者数组(动规)具体的意义,所代表的作用;第二,需要说明好递归处理数据的方式(递归)或者是阶段转移方程(动规);第三,跳出方法的条件(递归)或者是数组
其实我大概想法是想写一个动态规划的专题,然后里面可能有一些小专题,所以如果我没有鸽掉的话,这篇的链接会放入DP专题里面 这里大概就写写常见的背包问题吧。 ###01背包 可以说是最经典的背包问题了,有$n$个物品, 每个物品有一个价值$vi$和一个体积$wi$,背包的最多容纳体积之和为$m$的物体。 ...
转载
2021-09-06 20:18:00
45阅读
2评论
1、动态规划的定义 动态规划,dynamic Programming,是一种高效解决问题的方法,使用与具有重复子问题和最优子结构的问题。
题目:思路:动态规划fmax(i) 表示以第i个元素结尾的乘积最大子数组的乘积,fmin(i) 表示以第i个元素结尾的乘积最小子数组的乘积,这里分为最大和最小是因为数组可能存在负数,最大值乘以负数变成较小值,最小值乘以一个负数也可能变成最大值。class Solution {public: int maxProduct(vector<int>& nums) { vector <int> maxF(nums), m...
原创
2021-06-05 00:04:40
825阅读
贪心算法与动态规划在软考中的实践应用
在计算机科学与技术领域,算法无疑是核心之一,它们为解决各种问题提供了高效的策略和方法。在众多算法中,贪心算法和动态规划是两种常见的、在解决优化问题中极具实用性的策略。它们在软件水平考试(软考)中也占据了重要的位置,经常以例题的形式出现,检验考生对于算法原理和实践应用的掌握程度。
贪心算法,顾名思义,它总是做出在当前看来最好的选择,希望通过每个局部最优的选择
动态规划相信大家都知道,动态规划算法也是新手在刚接触算法设计时很苦恼的问题,有时候觉得难以理解,但是真正理解之后,就会觉得动态规划其实并没有想象中那么难。网上也有很多关于讲解动态规划的文章,大多都让人觉得晦涩难懂,即使一时间看懂了,发现当自己做题的时候又会觉得无所适从。我觉得,理解算法最重要的还是在于练习,只有通过自己练习,才可以更快地提升。话不多说,接下来,下面我就通过多个例子来一步一步讲解动态
目录0-1 背包问题递归动态规划JavaC++分割等和子集动态规划零钱兑换HashMap 来当记忆数组的递归动态规划贪心 + DFS零钱兑换 II递归动态规划C++pythonC++编辑距离递归动态规划C++python鸡蛋掉落动态规划0-1 背包问题给你一个可装载重量为W的背包和N个物品,每个物品有重量和价值两个属性。其中第i个物品的重量为wt[i],价值为val[i],现在让你用这个背包装物品
简介动态规划(dynamic programming,简称dp),是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法。(没办法,其实算法就是数学,毕竟数学是基础学科,由数学支撑的学科太多太多)分类动态规划一般可分为线性动规,区域动规,树形动规,背包动规四类。举例:线性动规:拦截导弹,合唱队形,挖地雷,建学校,剑客决斗等;区域动规:石子合并, 加分二叉树,统计单词
转载
2020-09-29 15:33:00
213阅读
五道经典动态规划问题1)最大子序列和题目描述:一个序列,选和最大的子序列转移方程:sum[i]=max{sum[i-1]+a[i],a[i]}当前元素的状态是:自己单独一组还是并到前面最后的答案max{sum[i]}扩展到二维:最大子矩阵方法一:而为前缀和 取maxsum[i][j]=sum[i-1
转载
2017-11-05 22:03:00
135阅读
2评论