算法第三章作业
一、实践报告
1.1题目要求必须在 (2N-1) 个单位时间内走出去。因为每走一格花1个时间,如果走回头路往左或者往上走就会超时。所以商人只能往右走或者往下走。
状态定义:设dp[i][j]表示从左上角起点走到当前格子(i,j)的最小花费。
递归方程式:dp[i][j]=min(dp[i-1][j], dp[i][j-1])+a[i][j]
边界条件:起点是dp[1][1]=a[1][1]。
1.2维度:开个二维数组dp[N][N]来存状态。
范围:i从1到N,j从1到N。
填表顺序:因为算当前格子要用到上面和左边的值,所以填表是从上往下,从左往右。双重循环,外层是i,内层是j。所以最优值存在右下角的dp[N][N]里。
1.3时间复杂度:就是两层for循环把N*N的网格遍历了一遍,每次状态转移是O(1),所以是 O(N²),空间复杂度也是 O(N²)。
二、对动态规划的理解和体会
动态规划核心思路就是把一个复杂大问题拆成重复出现的小问题,把小问题的答案记下来,下次再遇到直接用,避免反复计算,用少量空间换取时间效率。我认为最关键的两步首先是想清楚dp[i]代表什么,这个是解题的起点,然后是用状态转移方程找到小问题的结果怎么推出大问题结果的规律。它的实用性很强,求最值、计数、路径类的问题,用它比暴力解法的效率高很多。
浙公网安备 33010602011771号