这几周的实验课密集地学习了几个经典算法:归并排序、切绳子问题、最长公共子序列和背包问题。有的理解起来很快,有的却让我卡壳了好久。
对我来说接受度比较高的:背包问题
背包问题的动态规划思路我接受得很快。老师画出那张二维dp表的时候,我一下就明白了。“放还是不放”这个状态选择,以及 dp[i][j] = max(...) 这个状态转移方程,逻辑非常清晰,自己也能照着这个思路把代码实现出来。
最开始有点难以理解的:
1.归并排序:败在“合并”
“分治”思想好懂,递归拆分也没问题。但一到合并两个有序子数组的步骤,我就乱了。代码里全是处理边界和判断谁先推入新数组的 if-else,又长又容易出错。
我的解决措施是,我放下代码,用笔在纸上手动模拟了整个合并过程。画两个小数组,用两个指针一步步移动、比较、放入。这个笨方法让我瞬间理解了核心就是一个循环和两个指针的配合,想通后代码就简洁多了,变得思路清晰
2.切绳子问题:想不到思路
这道题要求绳子剪成段后乘积最大。我第一反应是暴力枚举,但显然不可行。当时完全没有思路,不知道如何高效地找到最优的切割方案。
后来是, 老师讲解了这道题算法的思想,并给出了关键结论:尽量多切出长度为3的段。我一开始不理解为什么是3,后来自己验证了几个例子(比如对比多切3和多切2的结果),才真正信服了这个策略。这让我明白,有些算法的“窍门”需要先接受结论,再通过实践去理解。
随笔最后:
这段时间的学习让我意识到,理解算法思想和动手实现是两回事。当代码写不下去时,回归最原始的手动模拟,或者用具体例子去验证规律,往往是打破僵局的最好方法。