题目思路:题目两种走法,向右或者向下,则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]; } };