时间复杂度:O(n²),空间复杂度:O(n)
解题思路
非常简单的一道动态规划题目。
对于移动到每一个格子的路径数,就是它左侧格子的路径数和上方格子的路径数之和,即动态转移方程为:
dp[i][j]=dp[i-1][j]+dp[i][j-1],i,j>0
那如果是左侧和上方的边缘格子应该如何求路径数呢?
由于只能向右和向下移动,所以上方边缘格子只能通过从起点开始向右移动到达,而左侧边缘格子同理,只能通过向下移动到达,所以它们的路径数都是1,这也是动态规划的边界条件。
综上,动态规划转移方程为:
由于状态转移只依赖于上一行元素和左边相邻元素,故可以用滚动数组降低空间复杂度为O(n)。
AC代码
func uniquePaths(m int, n int) int {
dp:=make([]int,n)
for i:=0;i<n;i++{
dp[i]=1
}
for i:=1;i<m;i++{
for j:=1;j<n;j++{
dp[j]=dp[j]+dp[j-1]
}
}
return dp[n-1]
}
感悟
AC这一题,我又对动态规划有了信心!