刚看到这题我一开始以为是Greedy,但是心里另一个声音叫我质疑一下。
很明显不能用greedy。
于是我用了recursion的方法来做, 结果尼玛Time Limit严重超时 甚至加了Memorization都没有效果。
话说写这个recursion的时候也是一直写错,感觉今天这个状态面试要GG
过去练习Pascal的题几乎没有,很讨厌三角形这个东西。 今天第一次做总结了几个小东西
1. 每一行的东西数量都跟行数值一样。row3 有3个东西,row4有4个。
2. adjacent这个东西。 原理是这样的,row i的第0个元素的adjacent在row i+1的还是0 position,以及0+1 position。 我最开始没画出来以为是index-1, index+1.
3. 我一开始比较担心的recursion(row+1, index+1) 是不是需要check index会不会超过row number range 其实也是瞎担心。这个edge case需要总结。
看完答案发现这题其实比较DP 类型。Discussion区基本都是用DP来做的这题。
i loop控制row, j loop控制 某一行的element. dp[]看起来是把row数分成了subproblem
这里DP是把col 分成了subproblem。因为越往上,col越来越上。
假设triangle 3 rows是一个subproblem。 4rows是一个subproblem。。。
对于Dp[j] 这个subproblem来讲, min sum = DP[j+1] 和dp[j] 中最小的那个+ triangle.get(i).get(j)
最妙的地方在于他是从last row of triangle 往上move的。因为大三角形的地盘部分的minsum其实是最小的子问题。大的问题是建立在底下的基础上。在identify subproblem问题上,这个答案真是猛。
而且通过这题发现DP的子问题没有绝对的标志,可以top-down也可以bot-top.
top-down solution:
需要用一个cache来记录值。
Edit:
原来这个都已经算基础题了。。。
看来最近狂练DP效果明显:
一遍过:
8月31号回顾一下,又有新的领悟。画出内存图,更容易理解。