获得徽章 7
- #刷题交流#
day17: 饭馆菜品选择问题
解题思路:
1.定义状态: 定义一个三维的动态规划数组 dp[i][j][l],其中 i 表示考虑前 i 道菜(范围是从 1 到 n),j 表示已经选了 j 道菜(范围是从 0 到 k),l 表示所选的 j 道菜中含有蘑菇的菜有 l 道(范围是从 0 到 m)。dp[i][j][l] 的值代表在相应状态下能得到的最小总价格。
2. 初始化边界条件:当什么菜都还没选的时候(即 i = 0,j = 0,l = 0),总价格自然是 0,所以 dp[0][0][0] = 0,而其他的 dp[0][j][l](j 和 l 不为 0 时)初始化为正无穷大,表示不可达状态,因为一开始没菜可选的情况下不可能有其他选择数量和含蘑菇菜数量的组合情况。
3. 状态转移方程推导: 对于每一道菜(遍历 i 从 1 到 n),有两种选择:选这道菜或者不选这道菜。
4. 在遍历完所有的菜(i = n),且选择 k 道菜(j = k)的各种含蘑菇菜数量(l 从 0 到 m)的状态中,找到最小的总价格值 min(dp[n][k])。如果这个最小值是正无穷大,说明无法按照要求选出 k 道菜,返回 -1;否则返回这个计算得到的最小总价格。
解毕.展开评论点赞 - #刷题交流#
day16: 数组元素之和最小化
解题思路:
1. 确保所有元素的最大公约数为k:数组中的所有元素必须是 k 的倍数, 因此我们可以从k开始, 构造数组元素为k,2k,3k...。
2. 保证数组中元素两两不同:上述方法自然满足条件,因为每个元素是k的倍数,且倍数不同。
3. 使数组元素之和尽可能小:选取前 n 个最小的倍数, 即k, 2k, 3k ... nk。
解毕.展开评论点赞 - #刷题交流#
day15: 优秀项目组初选评比
解题思路:
1. 排序:首先对得分数组 a 进行升序排序,这样我们就能更容易地查找满足条件的分数线。
2. 遍历所有可能的分数线:可以考虑所有的分数线 x 为数组 a 中的每一个得分。
3. 计算晋级与淘汰的数量:对于每一个分数线 x,我们可以计算得分大于 x 的项目组数量,进而计算得分小于或等于 x 的项目组数量。
4. 检查是否符合条件:检查得分大于 x 的项目组数量是否在区间 [m, n] 之间,如果是,则这个 x 是一个候选分数线。记录最小的满足条件的 x。
5. 返回结果:如果找到了合适的分数线,则返回该分数线;如果没有找到,返回 -1。
解毕.展开赞过评论2 - #刷题交流#
day14: 及格的组合方式探索
1. 动态规划状态 dp[i][s] 可以表示前 i 门课程的组合中,总分为 s 的情况。这个状态可以通过从前一状态转移得到。
2. 初始时,dp[0][0] = 1,表示没有课程时总分为0的情况。
3. 通过逐步加入课程和成绩,更新状态,最后求出总和符合条件的组合数。
4. 对最终的结果取模 202220222022。
解毕.展开评论点赞 - #刷题交流#
day13: 小U的数字插入问题
问题解析:
1. 将 a 和 b 都转换成字符串形式,便于操作。
2. 通过遍历 a 字符串的每个位置,在每个位置插入 b 字符串,然后计算结果。
3. 比较每次插入后的结果,找出最大的那个。
解毕。展开评论点赞 - #刷题交流#
day12: DNA序列编辑距离
解题思路:
1. 定义状态:设 dp[i][j] 表示将 dna1[0..i-1] 转换成 dna2[0..j-1] 所需的最少编辑步骤。
2. 状态转移:如果 dna1[i-1] == dna2[j-1],那么 dp[i][j] = dp[i-1][j-1],因为不需要任何编辑。
如果 dna1[i-1] != dna2[j-1],我们有三种操作:
插入:在 dna1 中插入一个字符,操作后变成 dp[i][j-1] + 1。
删除:删除 dna1[i-1] 中的一个字符,操作后变成 dp[i-1][j] + 1。
替换:将 dna1[i-1] 替换为 dna2[j-1],操作后变成 dp[i-1][j-1] + 1。
初始化:dp[0][j] 表示将空字符串转换为 dna2[0..j-1],需要 j 次插入;dp[i][0] 表示将 dna1[0..i-1] 转换为空字符串,需要 i 次删除。
返回结果:最终的编辑距离是 dp[m][n],其中 m 和 n 分别是 dna1 和 dna2 的长度。
解毕.展开赞过评论2 - #刷题交流#
day11: 小M的多任务下载器挑战106
解题思路:
1. 任务的区间表示:每个任务的下载时间可以表示为一个区间 [x, x + y],其中 x 是任务的开始时间,y 是任务的持续时间,x + y 是任务的结束时间。
2. 事件模拟:可以将每个任务的开始和结束时间视作“事件”。每个任务会有两个事件:一个是开始下载的时刻,另一个是结束下载的时刻。对于每个任务,记录下这两个事件,并将其按照时间顺序进行排序。
3. 计算并发数:当任务开始时,当前并发数加1;当任务结束时,当前并发数减1。通过遍历所有事件,计算并发数的最大值。
解毕展开评论点赞 - #刷题交流#
day10: 比赛配对问题
解题思路:
1. 每轮比赛的配对次数是由当前队伍数决定的:如果队伍数是偶数,则进行 n / 2 场比赛;如果队伍数是奇数,则进行 (n - 1) / 2 场比赛。
2. 每一轮后,队伍数会减少一半(如果是偶数),或者减少到 (n - 1) / 2 + 1(如果是奇数)。
3. 从初始队伍数 n 开始,每一轮比赛后,计算配对次数并更新剩余队伍数。
4. 重复这一过程,直到只剩一支队伍为止。
解毕.展开评论点赞 - #刷题交流#
day09: 构造特定数组的逆序拼接
解题思路:
1. 对于每个 i 从 1 到 n,需要生成一个从 n 到 i 的数组.
2. 将每个生成的数组拼接到一个结果数组中.
3. 最后返回拼接后的数组.
解毕展开赞过评论3 - #刷题交流#
day08: 小F的永久代币卡回本计划
解题思路:
1. 如果b == 0:
如果每天返还 b 勾玉为 0,那么小F永远无法回本,因为每天没有返还,购买的代币卡价格永远不能被抵消。所以如果 b == 0,我们直接返回正无穷,表示无法回本.
2. 正常情况:b > 0:
每天返还 b 勾玉,因此如果小F登录了 x 天,她总共能返还的勾玉数为 x * b。
要使得返还的勾玉数至少等于代币卡的价格 a, 如果 a % b != 0(即 a 不能被 b 整除),那么我们需要多登录一天。
解毕.展开评论点赞