
动态规划
动态规划
卡戎一生
这个作者很懒,什么都没留下…
展开
-
【算法分析】动态规划-动态规划解决问题下的算法性质分析
动态规划-一般解题思路分析众所周知,一个算法可以使用动态规划,务必需要满足两个条件,一:最优子结构;二:折叠子问题。本文通过对若干问题使用动态规划算法下的最优子结构和折叠子问题进行综合分析,由简单到复杂,总结出使用动态规划解决问题的一般解题思路。问题一:【青蛙跳格】一只青蛙一次能跳一格或者两格,求青蛙跳到n格有多少种跳法。最优子结构性质:该问题可以转换为求青蛙跳到n格的最多跳法,假设青蛙跳到n-2格有x种跳法,跳到n-1格有y种跳法,则青蛙跳到n格的最多跳法必然包含了max(x)+max(y),假设原创 2020-12-11 23:33:10 · 962 阅读 · 0 评论 -
【算法导论18】动态规划-骑兵拨号问题
18动态规划-骑兵拨号问题问题描述:有一个骑兵,按照下图移动,将骑兵放置在拨号盘上,接下来,骑兵会移动N-1格,每跳到一个格子就会拨出对应数字,总计N个数字(骑兵原来位置也算一次拨号),求拨出的不同号码次数。问题分析:首先简单分析可知,骑兵在每个原始位置,移动一次所到的位置可以列出,如1只能移动到6、8。而随着步数的增多,骑兵第二步、第三步移动的位置均是原来10个初始位置移动位置的排列组合。换句话说,骑兵移动N次,所拨出的号码,均可以由递推得出,由此想到使用动态规划。下面分析最优子结构性质:可以原创 2020-12-10 00:51:00 · 193 阅读 · 0 评论 -
【算法导论17】动态规划-最小旅行开销问题
17动态规划-最小旅行开销问题问题描述:给定一个数组,包含的值为一年内需要旅行的日期(以天数为基准),给定三种通行证cost[0],cost[1],cost[2],分别可以使用1天,使用7天,使用30天,设计本年旅行的最小开销出行方式。问题分析:每天都有4中情况:1 当天不出门,则不买票最好。2 当天要出门,则可以买三种类型的票。由于每种票的使用期限不同,因此买每种票对应后面的数天内,可以不需要买票。定义dp[i]为前i天最小出行开销,如果第i天需要出行,则从第i天,分别往前推1、7、30天内的旅原创 2020-11-10 23:05:08 · 1497 阅读 · 4 评论 -
【算法导论16】动态规划-分割数组最大和问题
15 动态规划-分割数组最大和问题问题描述:给定一个数组,对其进行分割,规定分割最大长度不能超过k,并将同一区间内数组的值改为该区间的最大值,请设计分割算法,使得分割出的数组经过改值后,数组和最大。问题分析:首先分析问题,将数组分割成子序列,属于通过子问题来求解,又因为各个数组的分割之间相互影响,因此该问题可以使用动态规划解决。第一步:定义函数模型。定义dp[i]为只考虑前i个数组,其分割数组的最大和。然后考虑递推公式,由于数组分割最大区间为k,因此应该考虑dp[i]与dp[j] (i-j≤k)原创 2020-11-10 21:56:04 · 894 阅读 · 0 评论 -
【算法导论15】动态规划-石子合并问题
15动态规划-石子合并问题问题描述:n堆石子以直线形式放置,现在要将石子有序的合成为一堆,规定一次只能选择相邻的石子进行合并,合并一次的得分为合并后石子的总数,请设计算法计算对这n堆石子合并后的得分最大值。问题分析:简单对该问题进行分析,该问题属于最优解问题,其次,选择某堆石子进行合并时,会影响到其他石子堆的选择,看起来像是动态规划问题。下面沿着动态规划设计思路展开。第一步:划分阶段。只有一堆石子时候,由于无法合并,所以得分为0;当有两堆石子时,得分只有一个,为两堆石子总数。当有三堆石子时,原创 2020-10-18 21:45:30 · 3908 阅读 · 0 评论 -
【算法导论10】动态规划-最大字段和
【10动态规划-最大字段和】**问题描述:**给定一个整数数组,包含负数,设计算法求出数组的最大字段和。**问题分析:**此问题较简单,先考虑若数组全为正数,则最大字段和为数组本身累加。当数组中存在负数时,首先仍对数组进行累加,当出现负数时,考虑当前最大字段和加上该负数后是否为正数,如果为正数,则继续执行,若为负数,则全部舍弃此前字段,从下一个数重新开始累加。最大字段和动态规划算法:int max(int *a,int n){ int max=0,b=0,i; for(i=1;i<=n;i原创 2020-08-15 21:27:42 · 648 阅读 · 0 评论 -
【算法导论09】动态规划-最长公共子序列
【09动态规划-最长公共子序列】问题描述:设现有两个子序列,请设计算法计算其最长公共子序列。问题分析:此问题采用动态规划来解决。动态规划三步骤:1 定义函数dp[i][j]。2 找通项公式(常见dp[i][j]与dp[i-1][j]、dp[i][j-1]、dp[i-1][j-1])之间关系。3 求出初始值。第一步:定义dp[i][j]由于所求为两个序列的最长子序列,因此dp[i][j]可表示为长度为i的A序列以及长度为j的B序列的最长公共子序列,如dp[2][4]表示长度为2的A序列和长度原创 2020-08-12 21:56:05 · 209 阅读 · 2 评论 -
【算法导论02】动态规划-01背包问题
02动态规划-01背包问题问题描述:假设你有一个背包,可以装N个商品,背包总承重为W,现有若干商品,每个商品有两个性质:重量w,价值p。请设计算法使得背包能装载最大价值商品。变量定义:c[i][j]:只考虑前i件商品,背包总体积为j的时候,背包最大装载价值。Wi:第i件商品的重量。Pi:第i件商品的价值。问题答案:c[N][W]思路分析:首先对商品按照性价比(价值/重量)进行排序,最简单思想是按照性价比从高到低进行装包,但这样会存在问题,因为商品不可分,不可能装1.5个商品。所以,应该这样原创 2020-07-23 22:50:42 · 901 阅读 · 0 评论 -
【算法导论01】动态规划-矩阵连乘
01动态规划-矩阵连乘#include<studio.h>const int N = 7;//矩阵个数//矩阵连乘算法void MatrixChain(int *p,int m[N][N],int s[N][N],int length){ int n = length-1; int l=0,i=0,j=0,k=0,q=0; for(i=1;i<length;i++) m[i][j]==0; for(l=2;l<=n;l++){ //矩阵链的长度,从2开始原创 2020-07-23 21:32:39 · 406 阅读 · 0 评论