Problem
Solution
题意为给你一个n行m列的棋盘,左上角的格子里有一个机器人,机器人每次只能向右或者向下走一步,问走到右下角的格子上有几种走法。
很明显是动态规划的题,设dp[i][j]是走到(i,j)这个格子的走法总数,那么其值就为dp(i-1,j)dp(i,j-1)两数之和(此处i-1、j-1需合法)
考虑边界情况,即i1或j1时,因为只能向下或向右走,所以这些格子都是只有一种走法。
基于上述想法,可以写出代码:
class Solution {
public:
int uniquePaths(int m, int n) {
int dp[n][m];
for(int i=0;i<m;++i) dp[0][i]=1;
for(int i=0;i<n;++i) dp[i][0]=1;
for(int i=1;i<n;++i){
for(int j=1;j<m;++j){
dp[i][j]=dp[i-1][j]+dp[i][j-1];
}
}
return dp[n-1][m-1];
}
};
写完之后看了一下,空间复杂度还能继续降低,我们计算dp[i][j]时只依赖dp[i-1][j]和dp[i][j-1],那么我们开一个一维dp数组即可,只需保证我们dp的顺序是从上到下从左到右就可以了。
class Solution {
public:
int uniquePaths(int m, int n) {
int dp[m];
for(int i=0;i<m;++i) dp[i]=1;
for(int i=1;i<n;++i)
{
for(int i=1;i<m;++i)
{
if(i==1) dp[i]+=1;
else dp[i]+=dp[i-1];
}
}
return dp[m-1];
}
};