第三章博文
1.关于数学三角形这道题目,从图形来看,它拥有自上而下的的逻辑结构,根据观察,可以列出以下的递归方程式:
假设我们使用一个二维数组c的下半三角来存放整个数学三角形,用i来控制行(从1开始),用j来控制列,那么就有:
1.c[i][j]=c[i][j]+c[i-1][j],j0 这表示当要计算三角形左边的边时,数组只要往下求和即可
2.c[i][j]=c[i][j]+c[i-1][j-1],ji-1这表示当要计算三角形右边的边时,数组进行斜向下的求和
3.c[i][j]=c[i][j]+max(c[i-1][j-1],c[i-1][j]),对于三角形而言,不在两个边界处的下一步路线选择只能沿左斜线向下或右斜线向下,在数组中呈现为当前路径的和等于当前格子的值加上左上或正上方的格子的求和值之间的较大者,以此来达到数字总和最大的目的。
在这个方程式中,公式1和公式2是动态规划的边界条件。在代码的实现中,实际上是一种填表法的方式。表的维度是2维的,表的范围则是n*n/2,结合上面的公式,可以得知填表的顺序是从上到下,从左往右。在最后一行中,最优值自然是最后一行的最大值。
由于我们的方法是填写一个二维表,则用二重循环的方式,时间复杂度是O(n2),空间复杂度也为O(n2)。事实上,假如只保留上一行的计算结果,可以将空间复杂度优化到O(n)。
2. 动态规划可以将一个复杂的问题分解成数个拥有最优子结构的子问题,降低了时间复杂度。同时相比于贪心算法来说,它能够找到全局的最优解,同时避免了重复的运算。
浙公网安备 33010602011771号