![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
动态规划算法
经典解决具有子结构问题的动态规划法
壹零叁玖
多多重复 百炼成钢
展开
-
动态规划之石子合并问题(Circle版)
问题描述简单说下结果是怎么来的:43=(4+4) + (4+4+5) + (4+4+5+9)53=(9+5) + (9+5+4) + (9+5+4+4)算法分析这个问题和普通的石子合并问题不同,简单的石子合并问题采用的是将石子线性排列并合并,但是这个问题要求石子按照圆圈排列,所以首尾两个石子是能够合并的。这就不由得引起我们的思考,我们怎么才能让首尾也相邻呢?方法有两个:1.遍历数组的时候将索引从0到2*n之间遍历,但是每次都要%n来求真实索引;2.直接扩展数组,将两个一模一样的数字连接在原创 2020-05-22 23:22:40 · 2487 阅读 · 0 评论 -
动态规划之独立任务最优调度问题
问题描述给出了每个作业在A、B处理机上处理的时间,我们应该找出所有任务全部完成的调度时间。题目分析题目要求我们设计一个动态规划算法,计算出完成所有作业所用的最短时间。根据我们动态规划的基本框架,先找到状态,然后选择,最终写出状态转移方程。那我们先看一下状态,这里面的状态无非是作业处理时间以及哪个机器来处理作业。所以我们只需要对这几个状态来进行选择。然后写出状态转移方程即可。这道题的状态转移方程有点难想,但是如果从选择的角度就没那么困难。我们应该选择什么呢?这里面无非只有两个机器,所以我们只需原创 2020-05-21 22:32:07 · 5132 阅读 · 0 评论 -
动态规划算法之最大k乘积问题
问题描述题目分析这是一道典型的动态规划问题,我们假设L(s,t)为I的从s位开始的t位数字组成的十进制数。f(i,j)表示L(0,L)的最大j乘积,则f(i,j)具有最优子结构性质。计算f(i,j)的动态规划递归式如下:f(i,j) = max{f(k,j-1) * L(k,i-k)} (1 <= k <= i)这个式子的意思是我们假设在第k位之前的最大j-1乘积是f(k,j...原创 2020-04-20 20:35:24 · 2253 阅读 · 0 评论 -
C++实现动态规划法解决最大m子段和问题
问题描述给定由n个整数(可能为负整数)组成的序列a1,a2,…,an和正整数m,要求确定序列a1,a2,…,an的m个不相交子段,使这m个子段的总和达到最大。最大m子段和问题是最大子段和问题在子段个数数目的推广。换句话说,最大子段和问题是最大m子段和问题当m=1时的特殊情况。关于m=1的最长子段和问题,可以参考我的另一篇文章:四种方法求最长子段和题目分析设b(i,j)表示数组a的前j项中i...翻译 2020-04-17 22:35:57 · 863 阅读 · 0 评论 -
C++动态规划解决数字三角形问题
问题描述找出数字三角形从上至下直接相邻的数字的最大和,每一行只能选出一个数字。题目分析我们按照一个一个类似矩阵的形式输入我们的数据,为了防止开辟多余的空间,我们直接在原输入的半矩阵上进行操作。这个问题最好的办法应该是自底向上来寻找最大加和,因为如果自顶向下加和的话,我们会发现,会出现下面的两个数据公用上面一个数据的情况,我们不好决定这个数据加到下一行的哪个数据上,如果单纯地只是找下一行较大...原创 2020-04-17 19:43:16 · 1116 阅读 · 0 评论 -
C++动态规划算法之最优批处理问题
问题描述在一台超级计算机上,编号为1,2,3···的n个作业等待批处理。批处理的任务就是将这n个作业分成若干批,每批包含相邻的若干作业。从时刻0开始,分批加工这些作业。在每批作业开始前,机器需要启动时间S,而完成这批作业所需的时间是单独完成批中各个作业需要时间的总和。单独完成第i个作业所需的时间是 ti,所需的费用是它的完成时刻乘以一个费用系数fi。同一批作业将在同一时刻完成。例如,如果在时刻 ...原创 2020-04-16 23:38:09 · 3074 阅读 · 1 评论 -
动态规划法解决矩阵连乘问题
问题描述矩阵连乘问题就是让我们找一个加括号的位置,使得加完括号之后矩阵的计算次数最小。这是一道典型的动态规划问题,而且和我们昨天讨论的题目动态规划解决多边形最优三角剖分很相似,大家可以参考一下。题目分析学过线性代数的朋友一定都知道矩阵相乘是有条件的,即AxB的条件是A矩阵的列数应该等于B矩阵的行数,这样两个矩阵才能相乘。现在考虑三个矩阵的连乘运算,加括号方式会对整个计算量产生影响。现有矩...原创 2020-04-14 16:58:44 · 4906 阅读 · 0 评论 -
动态规划法解决凸多边形最优三角剖问题
题目描述凸多边形最优三角剖分问题和矩阵连乘问题极其相似,矩阵连乘问题明天我会在博客中介绍。我们的目的是给定凸多边形P={v0,v1,…,vn-1},以定义在由凸多边形的边和弦组成的三角形上的权函数w,要求缺定该凸多边形的三角剖分,使得该三角剖分所对应的权,即三角剖分中诸三角形上权之和为最小。题目分析我们先聊一聊什么是凸多边形的三角剖分。多边形是平面上一条分段线性的闭曲线。也就是说,多边形...原创 2020-04-14 01:22:02 · 1139 阅读 · 1 评论 -
四种方法求解最大子段和问题
题目描述给定一段长度为n的序列,我们需要找到其中一个连续的子段,使这个子段中各个元素加和最大,如果这个数组中全为负整数,我们就定义这个子段和为0.题目分析首先我们的目的是找一个局部的子段但加和是全局最大,所以我们可以很自然地想到,直接暴力法遍历求解即可。方法一.暴力法求解我们设置一个i,从第1个位置开始遍历,这个i表示的是我们最大子段的起始位置,然后我们从j=i往后接着遍历,j表示的是...原创 2020-04-13 21:15:48 · 9313 阅读 · 5 评论 -
数学归纳法证明双色汉诺塔问题并用C++实现
问题描述问题描述的很清楚,我们可以理解成这是一个代编号的汉诺塔问题,编号大的盘子一定大,且编号为偶数的不能相邻排放,编号为奇数的也不能相邻排放。问题分析...原创 2020-04-11 19:54:15 · 1276 阅读 · 0 评论 -
C++给字符串排序——字典序问题
问题描述今天做的一道实验题,刚刚写完实验报告,就把自己实验报告中的内容在这里再大概说一下(可能会有较多报告中的截图,懒~)问题分析我们要求字符必须是升序排列的,所以如果给定字符串长度为3,且开头字母是a,所以我们应该决定出后两个元素,且后两个元素应该比a大,所以后两个元素的组合数应该是C(25,2)因为比a大的字母有25个,所以应该从25个中选出2个作为后两个字母填入指定位置。所以我们...原创 2020-04-10 23:35:44 · 5378 阅读 · 1 评论 -
算法实现——树的最大连通分支问题
问题描述我们每次在进行权重的加和之前可以事先判断一下权重是否为负数:·w[k]<0:直接跳过这个顶点k·w[k]>=0:假设sum(k)是以k为根节点的树的最大连通子图的权值,那么有递推关系:sum(k)=∑{sum(i)}+w(k)i是k的子节点,并且满足sum(i)>0我们所求的问题就是最大连通分支的权值max{sum(k)}中的k代码#include &l...原创 2020-04-07 17:10:22 · 906 阅读 · 0 评论 -
算法实现——字符串比较问题
问题描述利用动态规划的思想,求字符串A[1:i]与B[1:j]的扩展距离,其实就是求一个最优子问题:dp[i][j] = min(dp[i-1][j]+k,dp[i][j-1]+k,dp[i-1][j-1]+dist(ai,bj))我们的最优子问题的求解公式已经很明显了,就是在从大到小开始划分字符串,每次都在一个位置上加空格,与等长的另一个字符串比较,可以只在一个字符串上扩展,也可以两个一...原创 2020-04-07 16:46:23 · 1004 阅读 · 0 评论 -
算法分析——二维0-1背包问题
问题描述方法动态规划法解决问题,我们只需要每次在加入物品的时候保证不超过容量,不超过容积的情况下不断求当前价值的最大值即可.我们创建一个三维数组,维度分别为物品序号,当前容量和当前容积,在判断是否加入新物品之前,我们需要判断加入该物品与不加该物品的价值高低,这样的话,在往后加入物品时也可以修改曾经的选择,因为我们的数组中各个物品的加或者不加的情况都已经列举出来了,直接查找即可。#inclu...原创 2020-04-07 16:17:31 · 1407 阅读 · 0 评论 -
算法分析——单调递增子序列
题目描述设计一个算法,找出由n个数组成的序列的最长单调递增子序列并对算法进行分析。要求时间复杂度分别为O(nlogn)和O(n^2).方法1对数组进行遍历,我们设置一个计数器来统计递增序列的长度并初始化为1(最短的递增序列是一个单独的数组,因此初始化为1)每次如果后一个数>前一个数,则计数器+1,否则将计数器置为1。当每次碰到递减的数时,...原创 2020-04-07 15:46:22 · 1814 阅读 · 0 评论