遍历图通常用到的方式为dfs, bfs, 或者拓扑排序。 但是对于某些特定的情况,用动态规划去遍历图是非常有效率的,避免了重复计算已经计算过的vertex。
一个很好的例子: 有n个长宽[a, b] 不同的矩形, 如果一个矩形的长宽小于另一个矩形的长宽或者宽长,则这个矩形可以被大的那个嵌套, 则最多嵌套多少个矩形在一起。
这个题目可以用动态规划和深搜去做,dfs的效率要低得多。 思路就是读入一个包含a ,b的二维数组,遍历整个数组,如果有一个矩形可以嵌套另一个,则在另一个二维数组里的相应位置记上1, 即 if(a > A && b > B || a > b && b > A) arc[i[a]][j[a]] = 1; 如此建立一个只包含 01 的数组, 可以看出 这个数组这个有向图。 则问题转化为图的最长路径问题。
图的最长路径解: dfs: 以每一个row 为点 找出可以嵌套的矩形, 找到就向下继续找那个矩形可以嵌套哪些其他的矩形, 直至无法嵌套,更新路径长度在每一个vertical 上, 最后找到数组里最大值, 输出即可
比如说: 1 到 【2,3,5】, 5 到 【2, 3 ,6】 , 1是起点, 更新为1个矩形, 当深搜到 2 3 5三条路时 每一条路都更新递增一个1, 就是 【2,3,5】 都为2, 然后起点为5, 下层为 【2, 3, 6】 则 【2, 3 , 6】 都为 3,