题目思路:题目两种走法,向右或者向下,则dp的值就为上面或者左边两者值的加和
解法一:打表,开二维数组求dp
正常求就行,一般对于多组输入,打表有一定优势,但此题有些不同。。
class Solution {
public:
/**
*
* @param m int整型
* @param n int整型
* @return int整型
*/
int uniquePaths(int m, int n) {
// write code here
int dp[105][105];
for(int i=1; i<=100; i++) {
dp[1][i]=1;
dp[i][1]=1;
}
for(int i=2; i<=100; i++) {
for(int j=2; j<=100; j++) {
dp[i][j]=dp[i-1][j]+ dp[i][j-1];
}
}
return dp[m][n];
}
};解法二:滚动数组(优化),开一维数组,省空间
dp的值只和本行和上一行有关,进而发现递推式:dp[i]=dp[i]+dp[i-1]
即dp值等于上一层dp[i]+左边dp[i-1],进一步优化
class Solution {
public:
/**
*
* @param m int整型
* @param n int整型
* @return int整型
*/
int uniquePaths(int m, int n) {
// write code here
int dp[105];
for(int i=1;i<=n;i++){
dp[i]=1;
}
for(int i=2;i<=m;i++){
for(int j=1;j<=n;j++){
if(j==1){
dp[j]=1;
}
else if(j>1){
dp[j]+=dp[j-1];
}
}
}
return dp[n];
}
};
京公网安备 11010502036488号