1、最大子段和问题
问题描述:给定长度为n的整数序列,a[1…n], 求[1,n]某个子区间[i , j],使得a[i]+…+a[j]和最大。
示例:输入:(-2,11,-4,13,-5,2)
输出:最大子段和为20,所求子区间为[2,4]
2、拾捡硬币问题
问题描述:假如有n 个硬币排在一行,要求拾取其中的子序列,该序列的累加面值最大,但不能拾取相邻的两个硬币。
示例:输入5; 1; 2; 10; 6; 2,
输出:Max=17 (5,10,2)
3、 矩阵连乘问题
问题描述:矩阵连乘问题是通过给矩阵连乘时加括号,使得总的计算量最小。
示例:输入:[[49, 29], [29, 32], [32, 77], [77, 13], [13, 59]],
输出:((A1(A2(A3A4)))A5)
4、最短公共超序列问题
问题描述:给出两个字符串str1和str2,返回同时以str1和str2作为子序列的最短字符串。如果答案不止一个,则可以返回满足条件的任意一个答案。如果从字符串 T 中删除一些字符(也可能不删除,并且选出的这些字符可以位于T中的任意位置),可以得到字符串 S,那么S就是T的子序列。设1<=str1.length, str2.length<=1000,str1和str2都由小写英文字母组成。
示例:输入:str1 = “abac”, str2 = “cab”
输出:”cabac”
解释:str1 = “abac” 是 “cabac” 的一个子串,因为可以删去 “cabac” 的第一个 “c”得到 “abac”。 str2 = “cab” 是 “cabac” 的一个子串,因为可以删去 “cabac” 末尾的 “ac” 得到 “cab”。最终给出的答案是满足上述属性的最短字符串。
5、对于一个n=5的关键字集合,搜索概率如下表,请构造其最优二分搜索树。
6、买卖股票的最佳时机
问题描述:给定一个数组,它的第i个元素是一支给定的股票在第i天的价格。设计一个算法来计算你所能获取的最大利润。你最多可以完成k笔交易。注意: 你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
示例1:输入: [2,4,1], k = 2
输出: 2
解释: 在第 1 天 (股票价格=2)的时候买入,在第2天 (股票价格=4)的时候卖出,这笔交易所能获得利润=4-2=2 。
示例2:输入: [3,2,6,5,0,3], k = 2
输出: 7
解释: 在第 2 天 (股票价格=2) 的时候买入,在第3天 (股票价格=6)的时候卖出, 这笔交易所能获得利润= 6-2=4。随后,在第5天(股票价格=0)的时候买入,在第6天(股票价格=3)的时候卖出, 这笔交易所能获得利润=3-0=3
7、天平秤金条问题
问题描述:有30根金条,其中一根比其它的要重,请问用一个天平至少秤几次可以将这个重的金条找出来。
示例1:输入:[10, 10, 10, 10, 10, 11]
输出:The fake coin is coin 6 in the original list Number of weighings: 2
示例2:输入:[10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 11, 10, 10]
输出:The fake coin is coin 25 in the original list Number of weighings: 3
8、动态规划解最短路径问题
问题描述:从某顶点出发,沿图的边到达另一顶点所经过的路径中,求各边上权值之和最小的一条路径——最短路径。
示例:输入如下图(图的输入形式自行确定):
输出:从A到G的最短路径长度为: 18 经过的结点为: [‘B1’, ‘C2’, ‘D1’, ‘E2’, ‘F2’]
二、实验设备(环境)及要求
PC机,Windows 10
三、实验内容及结果
(包括实验过程、实验数据、实验结果及分析,实验代码另外单独附页)
1、最大子段和问题
问题描述:给定长度为n的整数序列,a[1…n], 求[1,n]某个子区间[i , j],使得a[i]+…+a[j]和最大。
示例:输入:(-2,11,-4,13,-5,2)
输出:最大子段和为20,所求子区间为[2,4]
想法:要求最大字段和与所求区间,即从0开始相加,依次记录newsum,并用begintemp与endtemp记录区间,用maxsum保存最大的sum,并且每次新的maxsum出现时重新记录begin与end区间,当sum小于0后,证明前面sum的只会使sum变小,则从i+1重新开始相加并记录newsum,并重新记录begintemp与endtemp,每次新的maxsum出现时重新记录begin与end区间。
1 | def maxSubSum(arr): |
2、拾捡硬币问题
问题描述:假如有n 个硬币排在一行,要求拾取其中的子序列,该序列的累加面值最大,但不能拾取相邻的两个硬币。
示例:输入5; 1; 2; 10; 6; 2,
输出:Max=17 (5,10,2)


1 | def dp_maxNonAdjacentSum(arr):#非递归动态规划解决不相邻的最大和 |
2.两个数组opt记录最大值,temp记录选择的硬币,opt【i】为第1个硬币到第i个硬币的最大值,有两种情况,分为选第i-1硬币时A=opt[i-2]+arr[i-1]与不选i-1硬币B=opt[i-1],故A与B中的最大值,同时给temp记录选取的硬币,并依次遍历。
3、 矩阵连乘问题
问题描述:矩阵连乘问题是通过给矩阵连乘时加括号,使得总的计算量最小。
示例:输入:[[49, 29], [29, 32], [32, 77], [77, 13], [13, 59]],
输出:((A1(A2(A3A4)))A5)
3.规划解决矩阵连乘,2个数组m s分别记录最少乘法次数与分割点的值,并用3次for循坏依次求出m,s[i][j],
1 | import numpy |
4、最短公共超序列问题
问题描述:给出两个字符串str1和str2,返回同时以str1和str2作为子序列的最短字符串。如果答案不止一个,则可以返回满足条件的任意一个答案。如果从字符串 T 中删除一些字符(也可能不删除,并且选出的这些字符可以位于T中的任意位置),可以得到字符串 S,那么S就是T的子序列。设1<=str1.length, str2.length<=1000,str1和str2都由小写英文字母组成。
4.要求最短共超序列,即先用动态规划求出最长公共子序列lcs,最短公共超序列scs即为两个字符串的最长公共子序列LCS+第一个字符串除去LCS之后的序列+第二个字符串除去LCS之后的序列。
1 | def shortestCommonSuperSequence(str1,str2): |
5、对于一个n=5的关键字集合,搜索概率如下表,请构造其最优二分搜索树。
.要找到最优二叉搜索树, e[i][j]用来记录包含k[i]到k[j]的最优二次搜索树的期望代价w[i][j]为k[i]到k[j]的所有子树的概率之和, e[i][j]=max(e[i][r-1]+e[r+1][j]+w[i][j]),r从1到j为根节点的位置,动态规划依次求出e[i][j],并使用flag为0,表示为根节点,flag为-1,表示k[root[i][j]]为左孩子,flag为1,表示k[root[i][j]]为右孩子,当j=i-1时,子树只包括伪关键字d[i-1]等输出最优二叉搜索树
1 | def OPTIMALBST(p,q,n): |
6、买卖股票的最佳时机
问题描述:给定一个数组,它的第i个元素是一支给定的股票在第i天的价格。设计一个算法来计算你所能获取的最大利润。你最多可以完成k笔交易。注意: 你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
示例1:输入: [2,4,1], k = 2
输出: 2
解释: 在第 1 天 (股票价格=2)的时候买入,在第2天 (股票价格=4)的时候卖出,这笔交易所能获得利润=4-2=2 。
示例2:输入: [3,2,6,5,0,3], k = 2
输出: 7
解释: 在第 2 天 (股票价格=2) 的时候买入,在第3天 (股票价格=6)的时候卖出, 这笔交易所能获得利润= 6-2=4。随后,在第5天(股票价格=0)的时候买入,在第6天(股票价格=3)的时候卖出, 这笔交易所能获得利润=3-0=3
1 | 在这里插入代码片 |
要求最大利益,且用k定义买卖的次数,则只有用3维数组profit[i][j][0]表示第i天第j次交易,身上没有股票时的最大利益profit[i][j][1]表示第i天地j次交易但身上有股票时的最大利益,并且对profit[i][j][0]与profit[i][j][1]都有2种求值的方法,在第i天可以买(卖)股票或不买卖股票,且还要用j记录是第几次交易,所有第i天要求profit[i][0][0],profit[i][0][1],profit[i][j][0],profit[i][j][1](j从1到k-1),profit[i][k][0],每种都要取2种求值方法的最大值,而最后的求解的最大值maxProfit=profit[len(prices)-1][j][0]
1 | def maxProfit(prices,k): |
7、天平秤金条问题
问题描述:有30根金条,其中一根比其它的要重,请问用一个天平至少秤几次可以将这个重的金条找出来。
示例1:输入:[10, 10, 10, 10, 10, 11]
输出:The fake coin is coin 6 in the original list Number of weighings: 2
示例2:输入:[10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 11, 10, 10]
输出:The fake coin is coin 25 in the original list Number of weighings: 3
7求比较重的金块,首先想到平分金块,但当我把程序后发现与要求输出的不一样,刚开始以为是程序错了,结果发现是算法错了,用最少的步数要找到重的金快可以用3分法,比较前2堆金快,若不一样则在重的那一堆继续3分,若一样则在第3份继续3分,而且这种方法的算法也更简单,不需要考虑金快为奇数还是偶数,在程序中,由于要找到是第几块金快比较重,使用left与right作为函数参数来记录金快的位置
1 | def HeavierGold(golds,left,right):#golds为金块重量,left,right为比较的范围 |
.
8、动态规划解最短路径问题
问题描述:从某顶点出发,沿图的边到达另一顶点所经过的路径中,求各边上权值之和最小的一条路径——最短路径。
示例:输入如下图(图的输入形式自行确定):
输出:从A到G的最短路径长度为: 18 经过的结点为: [‘B1’, ‘C2’, ‘D1’, ‘E2’, ‘F2’]
8.求多段图的最短路径长度,先用邻接矩阵表示出多段图,在用动态规划从终点到起点依次求出每一段的最短路径长度,并且用字典将邻接矩阵的序号与结点A1 B1等相连,最后输出进过的结点

1 | def shortestPath(cost,path,d): |