![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
动态规划
作业写不完的卑微小cookie
你连夜都不熬,那你熬什么,奥利给吗?
展开
-
动态规划解决愤怒的小鸟问题
愤怒的小鸟一、题目描述:游戏"愤怒的小鸟",各位仙家都玩过了吧,俗话说:“飞得越高,砸得更狠”,各小鸟们在游戏中简直是各显神通,竞相飞得更高,哪怕是粉身碎骨,但求美名留人间。为了获得更高的飞越高度,小鸟们不知从何处得到了一批神力大补丸,吃了这些大补丸将可以帮助小鸟们获得更高的飞行高度。不幸的是,不知道那个该死的叛徒走漏了消息,可恶的绿猪获得了这个情报,于是他们贿赂了当地的一个巫师,希望巫师从中作梗为难小鸟们,于是巫师连夜在这批大补丸上施加了一种可怕的诅咒,就是小鸟们在服用这些大补丸时,当吃到到奇数个大原创 2020-05-20 00:15:28 · 324 阅读 · 3 评论 -
利用滚动数组求解上楼梯问题
用滚动数组求解上楼梯问题一、【问题描述】一个楼梯有n个台阶,上楼可以一步上1个台阶,也可以一步上两个台阶,求上楼梯共有多少种不同的走法。二、【问题求解】设f(n)表示上n个台阶的楼梯走法数。显然f(1)=1,f(2)=2(一种是一步上一个台阶,走两步,另一种是直接一步上两个台阶)。对于大于2的n个台阶的走法数是f(n-1);一种走法是第一步上1个台阶,剩余n-1个台阶的走法数是f(n-1);另一种走法是一步上2个台阶,剩余的n-2个台阶的走法数是f(n-2)。综上 f(n)=f(n-1)+f(原创 2020-05-17 22:53:51 · 700 阅读 · 0 评论 -
用滚动数组求解0/1背包问题
用滚动数组求解0/1背包问题(此处仅求装入背包的最大价值)//由于第i个阶段(考虑物品i)的解dp[i][ * ]只与第i-1个阶段(考虑物品i-1)的解dp[i-1][ * ]有关,这种情况下保存更前面的数据已经毫无意义。因此可以利用滚动数组进行优化,将dp数组由dp[MAXN][MAXN]改为dp[2][MAXN]。因此0/1背包问题的状态转移方程如下:dp[0][0]=0,dp[1][0]=0dp[0][r]=0dp[c][r]=dp[1-c][r] (当r<w[i]时,物品i放原创 2020-05-17 22:37:18 · 565 阅读 · 0 评论 -
动态规划之滚动数组 用滚动数组求斐波那契数列 极大节省存储空间
一、定义在动态规划算法中,常用动态规划数组存放子问题的解,由于一般是存放连续的解,有时可以对数组的下标进行特殊处理,使每一次操作仅保留若干有用信息,新的元素不断循环刷新,看上去数组的空间被滚动地利用,这样的数组称为滚动数组。二、目的采用滚动数组的主要目的是压缩存储空间三、举例1.此处用斐波那契数列举例如下代码所示:#include<stdio.h>int dp[100]; //所有元素初始化为0int count=1; //累计调用的步骤int Fib1(int n){原创 2020-05-17 22:34:21 · 414 阅读 · 0 评论 -
动态规划用逆序法求解0/1背包问题
求解0/1背包问题一、【问题描述】有n个重量分别为{w1,w2,…,wn}的物品,它们的价值分别为{v1,v2,…,vn},给定一个容量为W的背包。设计从这些物品中选取一部分物品放入该背包的方案,每个物品要么选中要么不选中,要求选中的物品不仅能够放到背包中,而且重量和为W具有最大的价值。二、【问题求解】最优方案所指的是装入物品的价值最高,即 v1x1+v2x2+…+vn*xn(其中xi取0或者1,取1表示选取物品i)取得最大值。设置二维动态规划数组dp,dp[i][r]表示背包剩余容量为r(1&原创 2020-05-17 17:55:01 · 1366 阅读 · 0 评论 -
动态规划之买股票问题 逢低吸纳Buy Low, Buy Lower - 洛谷 C语言
买股票问题问题描述:“逢低吸纳”是炒股的一条成功秘诀。如果你想成为一个成功的投资者,就要遵守这条秘诀:"逢低吸纳,越低越买"这句话的意思是:每次你购买股票时的股价一定要比你上次购买时的股价低.按照这个规则购买股票的次数越多越好,看看你最多能按这个规则买几次。给定连续的N天中每天的股价。你可以在任何一天购买一次股票,但是购买时的股价一定要比你上次购买时的股价低。写一个程序,求出最多能买几次股票。输入:第一行输入天数N第二行输入对应的N天股票价格(注:输入可能有多组用例,1<=股价<=原创 2020-05-14 00:20:51 · 2769 阅读 · 0 评论 -
动态规划经典问题之求解完全背包问题
求解完全背包问题一、【问题描述】有n中重量和价值分别为wi、vi(1<=i<=n)的物品,从这些物品中挑选总重量不超过w的物品,求出挑选物品总价值和最大的挑选方案,这里每种物品可以挑选多件。二、【问题求解】1.设置动态规划二维数组dp,dp[i][j]表示从前i个物品中选出重量不超过j(或者剩余容量为j)的物品的最大总价值。①显然有边界条件:dp[i][0]=0(背包不能装入任何物品时,总价值为0),dp[0][j]=0(没有任何物品可装入时,总价值为0),可以采用memset函数一次原创 2020-05-12 01:22:42 · 1448 阅读 · 0 评论 -
动态规划之求解最长公共子序列问题 算法设计
求解最长公共子序列问题一、【问题描述】字符序列的子序列是指从给定字符序列中随意地(不一定要联系)去掉若干个字符(可能一个也不去掉)后所形成的字符序列。给定两个序列A和B,称序列Z是A和B的公共子序列,是指Z同是A和B的子序列,该问题是求两序列A和B的最长公共子序列(LCS)二、【问题求解】若设A= (a0, a1, . am-1),B= (b0, b1, … bn-1) ,设Z= (z0, ...原创 2020-05-08 14:18:05 · 4680 阅读 · 0 评论 -
动态规划之求解三角形最小路径问题
求解三角形最小路径问题一、【问题描述】:给定 高度为n的一个整数三角形,找出从顶部到底部的最小路径和,只能向先移动相邻的结点。首先输入n,接下来的1~n行,第i行输入i个整数,输出分为2行,第一行为最小路径,第2行 为最小路径和。例如,下图是一个n=4的三角形,输出的路径是2,3, 5, 3最小路径是13。 2 3 4 6 5 7 8 ...原创 2020-05-05 21:24:21 · 3190 阅读 · 1 评论 -
求出最大连续子序列和 暴力算法、分治法、动态规划、贪心算法实现;Leecode 51.最大子序和
①蛮力法(即暴力算法)实现:代码实现:int maxSubSum1(int a[],int n){ int i,j,k; int maxSum=0,thisSum; for(i=0;i<n;i++){ for(j=i;j<n;j++){ thisSum=0; for(k=i;k<=j;k++) thisSum+=a[k]; if(this...原创 2020-04-20 18:29:55 · 2044 阅读 · 0 评论 -
动态规划之求解整数拆分问题 非递归方法以及备忘录方法
求解整数拆分问题一、【问题描述】求将整数无需拆分为最大数为k(称为n的k拆分)的拆分方案个数,要求所有的拆分方案不重复二、【问题求解】设n=5,k=5,对应的拆分方案有①5=5②5=4+1③5=3+2④5=3+1+1⑤5=2+2+1⑥5=2+1+1+1⑦5=1+1+1+1+1该题适合用动态规划求解,设f(n,k)为n的k拆分的拆分方案个数:(1)当n=1,k=1时,显然f...原创 2020-05-01 16:14:14 · 1015 阅读 · 1 评论 -
算法设计与分析之动态规划概述
动态规划一、基本思想:通常求解具有某种最优性质的问题,在这类问题中可能会有许多可行解。每一个解对应于一个值,我们希望找到具有最优值的解。基本思想是将待求解问题分解成若干个子问题,先求解子问题,然后再从这些子问题的解得到原问题的解。适用于动态规划求解的问题,经过分解得到子问题往往不是互相独立的,若用分治法来解这类问题,则分解得到的子问题数目太多,有些子问题被重复计算了很多次,如果我们能够保存已解决...原创 2020-04-29 11:38:57 · 579 阅读 · 0 评论