- 博客(21)
- 收藏
- 关注
原创 动态规划:数字三角形(线性DP-闫氏DP分析法)
摘要:数字三角形问题采用动态规划解法,使用闫氏DP分析法。状态表示f[i][j]定义为使用前i层且取第j个数字时的最大值。状态转移方程为f[i][j] = max(f[i-1][j-1], f[i-1][j]) + arr[i][j]。解法从下往上计算,注意处理负数情况并初始化边界值。代码实现时优化空间复杂度,最终遍历底层取最大值输出。时间复杂度O(n²),空间优化到O(n)。
2025-06-18 17:18:17
575
原创 动态规划:合并石子(区间DP)
摘要 本文介绍了使用动态规划解决石子合并问题的区间DP方法。问题要求每次只能合并相邻的两堆石子,目标是找出最小合并成本。采用二维状态数组f[i][j]表示从i到j石子的最小合并成本,通过枚举区间长度、起点和分界点,利用前缀和优化计算。具体实现时,先预处理前缀和数组,然后按区间长度递增的顺序进行状态转移,最终输出f[1][n]作为结果。该方法时间复杂度为O(n³),适用于典型的区间DP问题。
2025-06-18 17:16:48
601
原创 动态规划:游戏
本文介绍了使用动态规划解决区间游戏问题的方法。状态f[i][j]表示先手玩家在区间[i,j]内的最大得分差,其转移方程为f[i][j]=max(w[i]-f[i+1][j],w[j]-f[i][j-1])。通过区间DP方法,先枚举长度再枚举起点,逐步填充DP表。最终,根据总分和得分差可以计算出两位玩家的具体得分。该算法有效模拟了玩家轮流取数的博弈过程,确保先手能够获得最大优势。示例展示了如何从单元素区间开始推导,逐步扩展到整个数组的过程。
2025-06-17 16:36:56
731
原创 动态规划:最长上升子序列 LCS (闫氏DP分析法)
本文介绍了动态规划解决最长公共子序列(LCS)问题的算法。通过定义状态f[i][j]表示序列A前i项和B前j项的LCS长度,分析四种转移情况:包含或不包含A[i]、B[j]的不同组合。重点指出求最大值时只需保证状态转移"不漏"而不必"不重"。给出了Java实现代码,使用二维数组存储中间状态,最终输出f[n][m]即为两个序列的LCS长度。该算法时间复杂度为O(nm),是解决LCS问题的经典动态规划方法。
2025-06-17 16:18:28
316
原创 数论:互质数的个数
这篇文章探讨了计算互质数个数的问题,提出了一种基于欧拉函数和快速幂的算法解决方案。文章首先给出了问题的数学表达,展示了如何将a^b分解质因数并计算其欧拉函数值。核心公式使用了欧拉函数的性质来计算与a^b互质的数的个数。作者提供了Java实现代码,包括分解质因数、欧拉函数计算和快速幂算法等关键部分。对特殊值a=1进行了单独处理,提高了算法的健壮性。整个解决方案的时间复杂度主要取决于分解质因数部分,为O(√a)。
2025-06-16 21:04:27
750
原创 数论:Stern-Brocot Tree 有序分数
摘要:Stern-Brocot树是一种维护有序分数的结构,包含所有正有理数。通过迭代构造序列,相邻分数间插入中位分数(a+c)/(b+d)生成下一阶序列。该树的中序遍历对应序列中的分数。在有序分数问题中,可采用递归方法实现O(n^2logn)解法,通过中序遍历输出0/1到1/1之间的所有最简分数。代码展示了如何利用递归生成指定范围内的Stern-Brocot分数序列。
2025-06-16 21:01:27
1135
原创 区间交集:用最少数量的箭引爆气球
这篇文章介绍了一个解决区间交集问题的算法,题目要求用最少数量的箭引爆所有气球。每个气球表示为[x_start, x_end]区间。算法首先对区间按照x_start排序,相同则按x_end排序。然后遍历区间,记录当前交集范围[l,r],当新区间与当前范围无重叠时增加箭数并重置范围;有重叠时缩小交集范围。这种方法确保每个交集只需一支箭,最终返回最小箭数。时间复杂度为O(nlogn)。该解法实际是区间选点问题的变体,通过贪心算法有效地找到最优解。
2025-06-15 20:57:33
246
原创 区间交集:区间选点
这篇题解介绍了区间选点问题的解法,核心思想是通过区间交集来确定最优选点位置。算法步骤如下: 将所有区间按左端点排序 初始化当前交集区间为极大值范围 遍历排序后的区间: 若当前区间与交集区间无重叠,则新增一个选点并重置交集区间 否则收缩交集区间为两者的重叠部分 最终选点数量即为所需答案 该方法通过贪心策略,每次尽可能让新选点覆盖最多区间,时间复杂度主要来自排序的O(nlogn)。Java实现中使用了自定义排序和区间合并的思想来高效求解。
2025-06-15 20:55:22
382
原创 区间合并:牛奶
本文介绍了区间合并算法在牛奶挤奶问题中的应用。题目要求计算农夫挤奶的最长连续时间段和最长中断时间段。算法首先对挤奶区间进行排序,然后遍历处理:当区间连续时扩展当前区间,计算最长连续时间;当区间中断时记录间隔时间,更新最长中断时间。关键点在于正确维护当前区间边界并及时更新最大值。代码使用Java实现,通过Pair类存储区间端点,时间复杂度为O(nlogn)。该算法有效地解决了牛奶挤奶时间统计问题。
2025-06-14 21:15:41
395
原创 区间合并:区间合并问题
区间合并算法实现 摘要:本文介绍了一种解决区间合并问题的有效算法。该算法首先对所有区间按照左端点进行排序,然后通过扫描整个区间序列来合并相交或相邻的区间。算法处理三种情况:完全包含、部分相交和完全相离,通过维护当前合并区间的右边界来实现高效合并。最终输出合并后的区间数量。代码使用Java实现,通过自定义Pair类和比较器完成排序,时间复杂度主要由排序步骤决定,为O(n log n)。
2025-06-14 21:13:30
353
原创 前缀和:K倍区间
摘要 K倍区间问题要求统计数组中满足区间和为K的倍数的子区间数量。核心思路是利用前缀和与模运算性质:当两个前缀和对K取模结果相同时,它们的差就是K的倍数。通过哈希表cnt[x]记录余数x的出现次数,初始时cnt[0]=1以处理整个前缀和为K倍数的特殊情况。遍历数组时,对每个位置的前缀和计算模值,将相同模值的出现次数累加到结果中,再更新哈希表。时间复杂度为O(n),空间复杂度为O(K)。
2025-06-13 19:18:31
1485
原创 递归分治:L 型覆盖问题
L 型覆盖问题要求在2^n×2^n棋盘上放置一个1×1指挥营,其余区域用L形军营填满。本文提出递归分治解法:将棋盘四等分,找出指挥营所在象限,在中心放置L形军营使其他三象限各有一个"假指挥营",然后递归处理各子区域。算法终止条件是2×2棋盘直接放置L形军营。通过递增编号标识不同军营,最后使用映射实现排序。Java实现展示了递归过程和编号处理,时间复杂度为O(n^2)。该方法高效解决了棋盘L形覆盖问题。
2025-06-12 08:29:15
375
原创 贡献法:牛的基因学
题目要求构造DNA序列t,使其与给定序列s的循环移位最大距离。采用贡献法优化: 分析发现每个字母对距离的贡献独立,只需确保每次选择出现次数最多的字母 统计s中各字母出现频率,找出最大值及其对应字母数量 结果等于字母数量的n次方(需取模) 算法将时间复杂度优化至O(n),避免了暴力计算的O(n³)复杂度。最终利用快速幂计算大数结果。该方法巧妙利用了字母贡献的独立性,通过数学分析简化了问题。
2025-06-12 08:25:57
1696
原创 贡献法:孤独的照片
摘要 本文介绍了使用"贡献法"解决孤独照片问题的算法思路。照片中每头孤独的牛(G或H)可以成为孤独区间的核心,通过预处理左、右两侧连续不同牛的数量,可在O(n)时间内统计所有可能的孤独区间。方法包括:计算左右两侧H数量的乘积、左侧至少2个H时的区间数、右侧至少2个H时的区间数。最终将所有符合条件的区间数累加得到答案。该算法避免了O(n^2)的暴力解法,实现了高效求解。
2025-06-11 20:41:29
988
原创 二分:你可以安排的最多任务数目
摘要:本文介绍了使用二分法解决最多任务安排问题的算法。给定任务数组、工人数组、药丸数量和药丸强度,要求在不使用或最多使用一片药丸的情况下,计算最多能完成的任务数。算法通过二分查找确定可能的最大任务数,并使用TreeMap和贪心策略验证每个候选值,优先处理容易的任务并合理使用药丸增强工人能力。最终返回满足条件的最大任务数。时间复杂度主要取决于排序和二分验证过程。
2025-06-10 10:55:45
376
原创 二分:切巧克力
该文章介绍了使用二分法解决"切巧克力"问题的思路。题目要求将n块巧克力切成尽可能大的相同尺寸的小方块,总共至少得到k块。算法核心是利用二分法确定最大可能的边长x:通过检查每个x值能切出的总块数是否满足要求,从而缩小搜索范围。时间复杂度为O(nlogn),其中二分查找O(logn),每次检查O(n)。文章包含详细的算法分析、数学公式和Java实现代码,展示了如何通过二分的高效性替代线性枚举来解决最大值问题。
2025-06-09 22:33:29
1014
原创 二分:借教室
摘要 本文解决了一个教室借用问题,利用二分查找优化算法效率。核心思想是将问题转化为判断前k个订单是否满足教室借用需求,使用差分数组高效处理区间增减操作。通过二段性特征(前k个订单满足条件而k+1不满足),使用二分查找定位临界点。当所有订单都可满足时输出0,否则输出第一个无法满足的订单编号。算法时间复杂度为O(n log m),适合处理大规模数据。该方法巧妙地将判断性问题与二分搜索结合,展示了算法设计中的转换思维。
2025-06-09 22:31:00
796
原创 单调栈:矩形牛棚
摘要:本文介绍了一个求解矩形牛棚最大空闲区域的算法。题目要求在R×C的网格中找到最大的不含障碍物的矩形面积。算法采用单调栈技术,首先计算每列上的连续空闲高度,然后将问题转化为n次直方图最大矩形求解,最终获得O(n²)的时间复杂度。Java实现中通过预处理高度矩阵,并对每一行应用单调栈算法来计算左右边界,从而求得最大矩形面积。代码展示了完整的实现过程,包括高度预处理和单调栈处理逻辑。
2025-06-08 19:03:55
1044
原创 Java ACM 模式
本文总结了Java在ACM模式下的输入输出方法。输入方面介绍了一维数据的Scanner用法和二维数据的BufferedReader实现,包括自定义Reader工具类和两种使用示例(split分割和逐个读取)。输出方面展示了一维数据的System.out.println()和二维数据的BufferedWriter用法,强调需要flush清空缓冲区。这些方法涵盖了ACM编程中常见的数据处理需求,提供了高效可靠的IO解决方案。
2025-06-07 10:27:09
285
原创 单调栈:直方图中最大的矩形
本文介绍了使用单调栈算法求解直方图最大矩形面积的问题。关键思路是:对于每个柱子i,计算其左右两侧能延伸的最大长度lmax[i]和rmax[i](不含自身),然后以当前柱子高度arr[i]为基准,计算可能的最大矩形面积arr[i]*(lmax[i]+rmax[i]+1)。文章通过数学推导证明无需考虑比当前柱子更小的基准高度,并提供了Java实现代码,包括使用单调栈预处理左右延伸长度、最终取所有可能矩形面积最大值的过程。该算法时间复杂度为O(n),适用于大规模数据。
2025-06-06 21:43:48
802
原创 双指针:牛的学术圈 I
这篇技术博客讨论了如何高效解决"牛的学术圈I"问题,提出了两种解法:二分法和双指针法。 二分法解法: 先将N个数从大到小排序 使用二分法查找最大h值,满足以下条件: 至少有h个数字≥h-1 最多有L个数字等于h-1 时间复杂度为O(nlogn) 双指针法解法: 同样先排序 使用双指针i和j,i从左向右移动,j从右向左移动 维护满足条件的最大h值 时间复杂度优化到O(n) 两种方法都通过巧妙的条件判断和指针移动来提高效率,避免了暴力枚举带来的高时间复杂度。
2025-06-05 20:37:49
1189
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人