题目链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=3&page=show_problem&problem=52
题目描述: 一个整数矩阵, 求第一列到最后一列的最小整数和, 只能从第一列出发向右, 右下, 右上走, 第一行的上一行是第m行,第m行的下一行是第一行, 打印出字典序最小方案
解题思路: 很简单的一个DP, 状态很容易设计, dp(i, j)表示从格子a(i, j)出发到最后一列的最小开销, dp(i, j) = min( dp(i-1, j+1), dp(i, j+1), dp(i+1, j+1) ), 其中有一些细节需要注意, 具体在代码中实现
代码: 这是我的错误代码, 只能够过得掉样例....打印路径难道我了......怎么说也搞了一年了啊.....真的菜
#include #include #include #include #include
View Code AC 代码
#include #include #include #include #include
View Code 思考: 本来是一道简单的DP题, 自己却写了一上午, 主要收获如下, 在要求打印路径的时候就要注意设计的状态应该是以dp[i][j]为起点, 不然会有一些BUG, 比如上面的错误代码, 还有一点很重要一点就是: 如果用数组迭代的话, 要保证在计算d[i][j] 时候, 你后面的状态转移设计到的式子全部已经有值........这点非常重要, 因为动态规划应该满足最优子结构, 也就是说, 子结构的值我应该知道, 如果想要倒过来求的话, (边界值在一边, 开始计算在另一边)就应该用到函数递归(记忆化搜索), 其实可以说的数组迭代就是递归的一部分(函数到底后反过来求值那一段。) 自己还是不熟啊, 为了区域赛能拿牌! 加紧练习!