Leetcode 刷题笔记——动态规划
- 将原问题分解为一系列子问题逐步解决,根据先前的状态求解当前的状态。
- 自底向上的计算顺序,求解当前问题需要保证规模更小的子问题的解已求出。
- 本质上是一种空间换时间的策略,通过记忆化存储的方式避免重复求解相同的子问题,因而往往比递归效率高。
- 空间复杂度往往可以进一步优化,二维数组变一维,一维数组变简单变量。这样做不仅节省空间,时间复杂度可能也会得到一定的常数优化。
- 将原问题分解为一系列子问题逐步解决,根据先前的状态求解当前的状态。
- 自底向上的计算顺序,求解当前问题需要保证规模更小的子问题的解已求出。
- 本质上是一种空间换时间的策略,通过记忆化存储的方式避免重复求解相同的子问题,因而往往比递归效率高。
- 空间复杂度往往可以进一步优化,二维数组变一维,一维数组变简单变量。这样做不仅节省空间,时间复杂度可能也会得到一定的常数优化。
- 贪心的核心思想是每一步都选择当前的局部最优解,从而最终获得全局最优解。
- 通常来说,一个问题的贪心解法比动态规划解法高效,而且更加直观,易于实现,所以我们可以首先考虑是否能用贪心来做,然而难点在于如何证明贪心的正确性。
- 贪心的题目变化多端,我们学习的更多是一种思维方式。但也有一些经典的题目类型(如区间重合问题),其原理大同小异。
这道题感觉没有必要用好几个数组甚至二维数组来做吧……把问题抽象一下,其实不需要显式地模拟棋盘的行列,而且可以让代码更加简洁。
房价预测是我入门Kaggle的第二个比赛,参考学习了他人的一篇优秀教程:https://www.kaggle.com/serigne/stacked-regressions-top-4-on-leaderboard
通过Serigne的这篇notebook,我学习到了关于数据分析、特征工程、集成学习等等很多有用的知识,在这里感谢一下这位大佬。
本篇文章立足于Serigne的教程,将他的大部分代码实现了一遍,修正了个别小错误,也加入了自己的一些视角和思考,做了一些自认为reasonable的“改进”。最终在Leaderboard上的得分为0.11676,排名前13%。虽然最后结果反而变差了一点(没有道理啊!QAQ),但我觉得整个实践的过程仍然值得记录一下。
废话不多说,下面进入正文。
泰坦尼克号幸存预测是本小白接触的第一个Kaggle入门比赛,主要参考了以下两篇教程:
本模型在Leaderboard上的最高得分为0.79904,排名前13%。
由于这个比赛做得比较早了,当时很多分析的细节都忘了,而且由于是第一次做,整体还是非常简陋的。今天心血来潮,就当做个简单的记录(流水账)。
这是一道贪心题,贪心的策略是将大臣们按左右手金币的乘积升序排列,具体证明过程可以参见洛谷大佬的题解,这里就不再赘述了。
这一单元的作业本质上是对数据之间的联系进行解析,并重新建立数据结构以方便查询的工作,这就要求我们了解各种UmlElement的结构以及他们之间的关系是如何组织的。
JML以javadoc注释的方式来表示规格,每行都以@起头。
//@annotation
/* @ annotation @*/
本次作业,需要完成的任务为单部多线程傻瓜调度(FAFS)电梯的模拟。
先来先服务的单电梯是一个标准的"生产者-消费者"模型。虽然在本次作业中调度器似乎是不必要的,但为了更好地应用"生产者-消费者"模型,并方便下一次作业的扩展,还是应该保留了调度器的概念,将其作为"托盘"来存放还未服务的请求。
第一次作业需要完成的任务为简单多项式导函数的求解。
因为仅仅是简单多项式的求导,所以求导本身没有什么可说的,直接套用幂函数的求导公式就行了,主要的精力是花在了正则表达式上。这里推荐两个网站: