动态规划-LeetCode-62.不同路径 ,LeetCode-63.不同路径2

在这里插入图片描述
在这里插入图片描述
分析:
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,不然就过不了。

猜你喜欢

转载自blog.csdn.net/qq_50932477/article/details/116241168
今日推荐