分析:
1.定义数组元素的含义:
设dp[i][j]表示从start走到(i,j)处的不同路径条数。start位置坐标(0,0),finish位置坐标(m-1,n-1).
2.找出数组元素的关系:
i.先考虑最后一步,只有两种可能,从(m-2,n-1)走到(m-1,n-1)和从(m-1,n-2)走到(m-1,n-1)。
ii.
dp[m-1][n-1] = dp[m-2][n-1] + dp[m-1][n-2] |
---|
iii.对于一般位置(i,j) , i>0&&j>0。从(i-1,j)走到(i,j)和从(i,j-1)走到(i,j)。
dp[i][j] = dp[i-1][j] + dp[i][j-1] |
---|
3.确定初始值:
假如只有一行或一列,显然都只有一种不同路径。
dp[0][j] = 1 | j= 0,1,2,…(n-1) |
---|---|
dp[i][0] = 1 | i= 0,1,2,…(m-1) |
AC代码:
#include <iostream>
using namespace std;
#define max 101
int m,n;
int dp[max][max];
int dpf(int m,int n)
{
int i,j;
for(i=0;i<m;i++)
dp[i][0]=1;
for(j=0;j<n;j++)
dp[0][j]=1;
for(i=1;i<m;i++)
{
for(j=1;j<n;j++)
{
dp[i][j]=dp[i-1][j]+dp[i][j-1];
}
}
return dp[m-1][n-1];
}
int main()
{
scanf("m=%d,n=%d",&m,&n);
int ans;
ans=dpf(m,n);
cout << ans << endl;
return 0;
}
接着看LeetCode63.最小路径2:
只需要在求行,列初始判断是否有障碍物,若没有初始值为1,若有循环结束。再求dp[i][j],也需要判断(i,j)处是否有障碍物。
完整代码:
#include <iostream>
using namespace std;
#define max 101
int m,n;
int a[max][max];
int dp[max][max];
int dpf(int m,int n)
{
int i,j;
for(i=0;i<m;i++)
{
if(a[i][0]==0) dp[i][0]=1;
else break;
}
for(j=0;j<n;j++)
{
if(a[0][j]==0) dp[0][j]=1;
else break;
}
for(i=1;i<m;i++)
{
for(j=1;j<n;j++)
{
if(a[i][j]==0)
dp[i][j]=dp[i-1][j]+dp[i][j-1];
}
}
return dp[m-1][n-1];
}
int main()
{
cin>>m>>n;
int i,j;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
cin>>a[i][j];
int ans;
ans=dpf(m,n);
cout << ans << endl;
return 0;
}
在力扣上不知道为啥dp数组起始全部赋值0,不然就过不了。