70. 爬楼梯
dp思想:
dp[i][j]表示机器人移动到(i,j)网格上,此时有dp[i][j]条不同的路径
初始dp[i][1] = 1, dp[1][i] = 1
递推关系式:dp[i][j] = dp[i-1][j] + dp[i][j-1]
#include<iostream>
using namespace std;
const int maxn = 105;
//dp思想
//dp[i][j]表示机器人移动到(i,j)网格上,此时有dp[i][j]条不同的路径
//初始dp[i][1] = 1, dp[1][i] = 1
//递推关系式:dp[i][j] = dp[i-1][j] + dp[i][j-1]
int uniquePaths(int m, int n) //m为行数, n为列数
{
int dp[maxn][maxn] = {0};
for(int i=1;i<=n;i++)
dp[1][i] = 1;
for(int i=1;i<=m;i++)
dp[i][1] = 1;
for(int i=2;i<=m;i++)
for(int j=2;j<=n;j++)
dp[i][j] = dp[i-1][j] + dp[i][j-1];
return dp[m][n];
}
//精简代码
//初始dp[1][1] = 1
int unique_Paths(int m, int n) //m为行数, n为列数
{
int dp[maxn][maxn] = {0};
//保证for循环中 dp[1][1] = 1
dp[0][1] = 1;
dp[1][0] = 0;
// 下边的也可以
// dp[0][1] = 0;
// dp[1][0] = 1;
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
dp[i][j] = dp[i-1][j] + dp[i][j-1];
return dp[m][n];
}
//优化空间--滚动数组
//想不明白可以自己动手画画图
int unique__Paths(int m, int n) //m为行数, n为列数
{
int dp[maxn] = {0};
for(int i=1;i<=n;i++)
dp[i] = 1;
for(int i=2;i<=m;i++)
for(int j=1;j<=n;j++)
dp[j] += dp[j-1];
return dp[n];
}
int main()
{
int m, n;//m为行数, n为列数
cin>>n>>m;
cout<<unique__Paths(m, n)<<endl;
return 0;
}
其实,这道题用深搜也能做,但是就是会超时。
#include<iostream>
using namespace std;
int m, n;
int num = 0;
//第一种写法
void dfs(int i, int j)
{
if(i==m && j==n){
num++;
return;
}
if(i > m || j > n)
return;
dfs(i+1, j);//向下走
dfs(i, j+1);//向左走
}
//换种写法
int dfs2(int i, int j)
{
if(i==m && j==n)
return 1;
if(i > m || j > n)
return 0;
return dfs2(i+1, j) + dfs2(i, j+1);
}
int main()
{
cin>>n>>m;
// dfs(1,1);
// cout<<num<<endl;
cout<<dfs2(1,1)<<endl;
return 0;
}