【LeetCode】62. 不同路径(动态规划--中等)

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;
}
发布了61 篇原创文章 · 获赞 45 · 访问量 6666

猜你喜欢

转载自blog.csdn.net/qq_38861587/article/details/105135852
今日推荐