Triangle

Triangle_第1张图片
Triangle_第2张图片

刚看到这题我一开始以为是Greedy,但是心里另一个声音叫我质疑一下。

很明显不能用greedy。

Triangle_第3张图片

于是我用了recursion的方法来做, 结果尼玛Time Limit严重超时 甚至加了Memorization都没有效果。

话说写这个recursion的时候也是一直写错,感觉今天这个状态面试要GG

Triangle_第4张图片

过去练习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问题上,这个答案真是猛。

Triangle_第5张图片

而且通过这题发现DP的子问题没有绝对的标志,可以top-down也可以bot-top.



Triangle_第6张图片

top-down solution:

需要用一个cache来记录值。

Triangle_第7张图片


Edit:

原来这个都已经算基础题了。。。

Triangle_第8张图片


Triangle_第9张图片


Triangle_第10张图片


Triangle_第11张图片

看来最近狂练DP效果明显:

一遍过:


Triangle_第12张图片

8月31号回顾一下,又有新的领悟。画出内存图,更容易理解。

Triangle_第13张图片

你可能感兴趣的:(Triangle)