2021-10-11

在这里插入图片描述

矩阵链乘
算法:这个问题的一个关键特征是:计算A[1:n]的最优次序所包含的计算矩阵子链A[1:k]和A[k+1:n]的次序也是最优的。如果计算A[1:k]的次序需要的计算量更少,则用此次序替换原来计算A[1:k]的次序,得到的计算A[1:n]的计算量将比最优次序所需计算量更少,这是一个矛盾。同理可知,计算A[1:n]的最优次序包含的计算矩阵子链A[k+1:n]的次序也是最优的。那么只需要找出k的最佳位置,递归的再找出每个子链的最佳位置,最终可得到整体问题最优解。可借助一个数组s来存储最佳断开位置,数组m来存储最小相乘次数。

时间复杂度:O(n^3)。
游艇问题
算法:a[i][j]表示从第i个租借点到第j个租借点的租金,比较从第s个到第n个的最少租金,选择分割点i(n>i>s),比较s到i的租金加上i到n的租金是否比当租金值少,若是则替换当前租金值。
时间复杂度:O(n^2)。
数字三角形

算法:数组a存放数字三角形的元素,数组D(i,j)表示的是从a(i,j)到底边的最优解,即从a(i,j)到底边路径中各条路径数字之和最大的一个。从倒数第二行开始,每个元素存放的是自身的值加下面行的最大值 ,将每个元素的最优值保存起来,最后D[1][1]就是最优解。
时间复杂度:O(n^2)。

算法:数组a存放数字三角形的元素,数组D(i,j)表示的是从a(i,j)到底边的最优解,即从a(i,j)到底边路径中各条路径数字之和最大的一个。备忘录法是将每个元素的最优解保存起来,避免重复计算,下次直接调用即可,可以先将所有的元素的最优解初始化为-1,如果发现它的值大于0,那就是计算过下次直接调用即可。
时间复杂度:每个元素计算一次,一共n行,那么数字总数就是n(n+1)/2,时间复杂度就是O(n^2)。
最长公共子序列
算法:
1)初始化两个序列x[i],y[j]
2)定义数组c[i][j]存储最优值
3)从两个序列末尾开始比较x y序列,
① 最后一个元素相等:c[i][j]=1+c[i-1][j-1];
② x去掉现有序列最后一个元素最优值更大(c[i - 1][j] >= c[i][j - 1]):c[i][j] = c[i - 1][j];
③ y去掉现有序列最后一个元素最优值更大(c[i][j-1] >= c[i-1][j]): c[i][j] = c[i][j-1];
④ 输出最优解
时间复杂度:(2)O(mn)
0-1背包问题
算法:设m[i,j]为前i种物品装入容量为j的背包获得的最大价值。包含第i个物品的子集的最优子集的价值:vi+m[i-1,j-wi]不包含第i个物品的子集的最优子集的价值:m[i-1,j],取两者最大的F[i,W]=max{vi+m[i-1,j-wi],m[i-1,j]}
时间复杂度:O(mn)
字符串递增子序列
算法:
方法一:
例如:acbed
① 做子序列末尾的子序列长度为1
② c做a子序列末尾的序列可以是ac,c,ac较长,所以c做末尾序列长度为1+1=2
③ b做子序列末尾的序列可以是b,ab,因为b<c,所以b不能加在c后面,ab 较长,长度为1+1=2
④ e作为末尾,可以排在a,b,c后,其中c,b的序列长度相同,可选择任意 一个,此处选c,序列长度为2+1=3
⑤ d作为末尾,可以排在a,b,c后,b、c一样长,可排在c后,序列长度为2+1=3
⑥ 综上,最长公共递增子序列长度为3
方法二:
例如:acbed
① 将第一个元素a直接放入数组中,此时数组 a
② 第二个元素和数组最后一个元素比较,大于就放入,此时数组 a c
③ 第三个元素与数组最后一个元素比较,若小于就替换,因为在后续的元素中,一定是比小的数大的元素更多,此时数组a b
④ 同理,此时数组a b e
⑤ 同理,此时数组 a b d
⑥ 数组中共有三个元素,则最长公共递增子序列长度为3
时间复杂度:
1)方法一:每个元素做末尾都要和前面的元素进行比较,O(n^2)
2)方法二:决定是否将元素放入数组时,要在数组中二分查找比自己小的元素,O(nlogn)
石子合并问题
算法:
1)f[N][M]:N堆M堆的最少合并值,初始化为非常大,s[N]:依次合并1N堆的值。
2)与多边形游戏类似,将圆形堆链拆开,选择任意连续N个堆中合并值最小的堆。
3)求解最优合并值第一步一定是取两个子堆列合并值和自身的合并值中较小的那一个,此时子堆列的合并值一定也是最小的,否则会有更小的整体最优解,可见问题具有最优子结构。
4)自底向上求解,将每个可能的堆列的合并值都求出
5)得到最优解f[1][n]
时间复杂度:(2)O(n^3)
能否划分成两个子集
算法:若是集合中所有数的和为奇数,那么肯定不能分为两个和相同的子集;
如果和是偶数sum,那么这个问题可以看成是容量为sum/2的背包最大能装的物品价值(数的值)能否到达sum/2(物品价值和重量相等的背包问题);
时间复杂度:O(mn)
最小m段和
算法:
用d[i][j]存储长度为i,分j段后其子序列和的最大值的最小值,那么它由两部分构成:当j=1时,d[i][1]表示的是长为i的整个序列的和;当j>1时,d[i][j] = min(for(k=1; k<=i; k++)max(d[k][j-1], d[i][1] - d[k][1]));这当中k表示的是分段的最后一段子序列的开始下标,所以d[k][j-1]是前面j-1段子序列和的最大值的最小值,d[i][1] - d[k][1]是最后一段子序列的和。
时间复杂度:(2)O(mn^2)
机器调度问题
算法:
dp[i][j]代表的是完成前i项任务,机器A需要j时间,机器B所需要的最少时间,那么完成前i项任务所需要的最终时间就是两台机器所需时间的最大值,所以最后输出dp[n][i]与i的最小值,i从0到sum(代表所有a[i]相加的总和)。
时间复杂度:O(n^2)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值