考虑一个二维 m*n 网格,其中每个单元格可以包含 1 或 0。通过移动通过该网格找到遍历可以获得的最大值。可以通过对角线穿过 1 个单元格来增加该值。网格的遍历遵循以下规则:
- 从左上角的单元格开始。
- 在每个单元格处,遍历可以向下移动一个网格、向右移动一个网格或沿对角线移动(向下移动一个网格并向右移动一个网格)。如果单元格包含 1 并且遍历沿对角线移动,则遍历值增加 1。
- 遍历不能移出网格(如果在右边缘不能向右移动,如果在底部边缘不能向下移动)。
- 在右下角结束。
一个简单的算法会考虑所有 3*m*n 遍历并选择最大值。有人可以帮我想出更好的解决方案吗?有没有解决类似问题的算法?
这不是一个面试问题,我需要这个来尝试优化 Smith-Waterman 算法。
例子:
以下网格的最大值为 2:
这个最大值为 7: