
获得徽章 0
- #刷题交流# 宝石矩阵最大边长
首先创建一个 m+1 x n+1 的二维前缀和数组 prefix_sum,其中 prefix_sum[i][j] 表示从 (0,0) 到 (i-1,j-1) 的子矩阵的能量总和。
通过动态规划的方式填充 prefix_sum 数组。
二分查找最大边长:
由于我们需要找到最大的正方形边长,可以使用二分查找来优化搜索过程。
设 low 为 0,high 为 min(m, n),在 [low, high] 范围内进行二分查找。
对于每个中间值 mid,检查是否存在一个边长为 mid 的正方形满足能量总和不超过 M。
检查正方形是否满足条件:
对于每个可能的正方形左上角坐标 (i, j),计算以 (i, j) 为左上角,边长为 mid 的正方形的能量总和。
使用前缀和数组快速计算该正方形的能量总和,并与 M 进行比较。展开赞过评论1 - #刷题交流# 小S的`01`问号串
解题思路
动态规划:
我们可以使用动态规划来解决这个问题。定义一个状态 dp[i][0] 和 dp[i][1],分别表示在第 i 个位置上,前一个字符是 '0' 和 '1' 时的权值之和。
初始状态:dp[0][0] 和 dp[0][1] 取决于字符串的第一个字符。
状态转移:
如果当前字符是 '0' 或 '1',直接更新 dp 数组。
如果当前字符是 '?',则需要考虑两种情况('0' 和 '1'),并分别更新 dp 数组。
最终结果:
最终的权值之和是 dp[n-1][0] + dp[n-1][1],其中 n 是字符串的长度。展开赞过评论1 - #刷题交流# 小R的投影面积优化
算法步骤
计算初始面积:
计算初始的投影面积。投影面积可以通过累加相邻点之间的矩形面积来计算。
尝试所有可能的交换:
遍历所有可能的点对 (i, j),其中 i < j,尝试交换这两个点的纵坐标。
计算交换后的投影面积。
如果交换后的面积大于初始面积,记录当前的交换点对。
选择最优交换:
如果有多个交换方案,选择第一个横坐标较小的方案;如果仍然有多个方案,选择第二个横坐标较小的方案。
返回结果:
如果没有找到任何可以增大面积的交换,返回 [-1]。
否则,返回选择的交换点对的横坐标。展开赞过评论1 - #刷题交流# 小M的蛋糕切割问题
算法步骤
计算前缀和:
创建一个 n+1×m+1 的前缀和数组 prefix_sum,其中 prefix_sum[i][j] 表示从 (0,0) 到 (i-1,j-1) 的子矩阵的美味度之和。
使用动态规划的方式填充 prefix_sum 数组。
枚举所有可能的切割方式:
水平切割:枚举每一行作为切割线,计算上下两部分的美味度之和。
垂直切割:枚举每一列作为切割线,计算左右两部分的美味度之和。
计算美味度差:
对于每一种切割方式,使用前缀和数组快速计算两部分的美味度之和。
计算美味度差,并更新最小值。展开赞过评论1 - #刷题交流# 小R的二叉树探险
算法步骤
确定层级:我们需要确定节点 x 和 y 所在的层级。由于每层的节点数是2的幂次方,我们可以通过计算 log2(x) 和 log2(y) 来确定它们所在的层级。
层级遍历:使用BFS遍历树,记录每个节点的层级和父节点信息。
路径计算:一旦我们知道了 x 和 y 的层级和父节点信息,我们可以通过回溯找到它们的最近公共祖先(LCA),然后计算从 x 到 LCA 和从 LCA 到 y 的路径长度。展开赞过评论1 - #刷题交流# 小U的早餐选择计算
解题思路
理解问题:我们需要计算所有可能的主食和饮料组合,使得总花费不超过 x。此外,还需要考虑只选择主食或只选择饮料的情况。
数据结构选择:我们可以使用两个数组 staples 和 drinks 来存储主食和饮料的价格。
算法步骤:
遍历所有主食和饮料的组合,计算每种组合的总花费。
统计总花费不超过 x 的组合数量。
单独统计只选择主食或只选择饮料的情况。展开赞过评论1 - #刷题交流# 小U的好字符串
算法步骤
定义状态:
设 dp[i][j] 表示以字符 s[i] 结尾且长度为 j 的子序列中好字符串的数量。
状态转移:
对于每个字符 s[i],我们需要考虑所有可能的长度 j 的子序列。
如果 s[i] 与之前的某个字符 s[k] 相同(k < i),那么以 s[i] 结尾且长度为 j 的子序列中,长度为 j-1 的子序列不能以 s[k] 结尾,因为这样会形成回文子串。
初始化:
对于每个字符 s[i],长度为1的子序列总是好字符串,所以 dp[i][1] = 1。
最终结果:
我们需要计算所有长度为 j 的子序列中好字符串的总数,并对结果取模 10^9 + 7。展开赞过评论1 - #刷题交流# 小U的`chi`权值计算
步骤
状态定义:
我们可以定义三个状态数组 dp_c、dp_h 和 dp_i,分别表示到当前位置为止,以 'c'、'h' 和 'i' 结尾的所有可能字符串的权值之和。
状态转移:
对于每个字符,我们需要根据它前面的字符和后面的字符来更新状态。
如果当前字符是 'c',则更新 dp_c。
如果当前字符是 'h',则更新 dp_h,并计算它前面的 'c' 对它的贡献。
如果当前字符是 'i',则更新 dp_i,并计算它前面的 'h' 对它的贡献。
如果当前字符是 '?',则需要考虑所有可能的替换情况,并更新相应的 dp 数组。
结果:
最终的结果是所有以 'i' 结尾的字符串的权值之和,即 dp_i 的最后一个元素。展开赞过评论1