P263底部
- 为什么只删除break语句不能求出完整解?
画出解答树之后,可以看出递归完之后是从最后一层节点继续递归,而不是从头递归,所以需要定义一个数组存储路径。
P264顶部
- 为什么dp[i]定义为以节点i为终点的最长路径长度,可以求最大dp,却难以求出最优路径?
因为是从终点递归(也就是矩形最大的开),不好确定第一位是否是最小值,只有求出了完整的路径之后才能确定最优路径
P267 Uva1025
- dp的两种定义方式:当dp[i][j]定义为到达状态为
时刻i,站台j时,所需要的最少时间。如果某个dp[i][j]=0,可能是搭乘的从0点出发的列车。P283 Uva1218
- 将dp[i][2]初始化为INF,也就意味着用INF代表该状态
非法。其次,利用代换,将求dp[u][2]的时间复杂度降低为O(n):例如,当计算child节点时,dp[cur][2]=MIN(dp[child0][0]+dp[child1][2]+dp[child2][2]),对于每个child节点都要枚举k次,计算k次,所以原本时间复杂度为O(n^2).但是,一代换,dp[cur][2]=MIN(dp[cur][1]-dp[child0][2]+dp[child0][0]). - 其次,本题可以既可以递推也可以递归。如果利用递推,需要用栈将节点保存。
Uva10003
- Uva10003题,刚开始想的是将状态定义为d[i][j]:先切i,最后切j。这样定义状态导致后续状态转移困难。其次,最开始认为切三刀的最优解依赖于切两刀的最优解,这样看也能转化为最优子结构问题,但是如果这样做就会产生书上所说的一个问题,没有顺序规范化。即便是像参考代码一样考虑到了顺序规范化,将dp[i][j]定义为切割点a[i]~a[j]的最优解,也会产生很多细节问题(边界处理).