题目链接:https://leetcode-cn.com/problems/out-of-boundary-paths/submissions/
方法:动态规划,定义一个状态dp[i][j][k],表示从(i,j)最大移动几步出界
class Solution {
public:
int findPaths(int m, int n, int maxMove, int startRow, int startColumn) {
const int mod = 1000000007;//定义取余的余数
int dp[51][51][51]={0};//dp数组,依次为x坐标,y坐标,最大移动长度
for(int i=0;i<m;i++)//初始化边界
{
for(int j=0;j<n;j++)
{
if(i==0)
{
for(int k=1;k<=maxMove;k++)
{
dp[i][j][k]++;//这意味着从(i,j)出界,最大路径长度为k的情况数+1
}
}
if(i==m-1)
{
for(int k=1;k<=maxMove;k++)
{
dp[i][j][k]++;//这意味着从(i,j)出界,最大路径长度为k的情况数+1
}
}
if(j==0)
{
for(int k=1;k<=maxMove;k++)
{
dp[i][j][k]++;//这意味着从(i,j)出界,最大路径长度为k的情况数+1
}
}
if(j==n-1)
{
for(int k=1;k<=maxMove;k++)
{
dp[i][j][k]++;//这意味着从(i,j)出界,最大路径长度为k的情况数+1
}
}
}
}
vector<pair<int,int>> dir={{0,1},{0,-1},{1,0},{-1,0}};//枚举四个方向
for(int i=1;i<=maxMove;i++)//枚举可移动步数
{
for(int j=0;j<m;j++)//枚举横坐标
{
for(int k=0;k<n;k++)//枚举纵坐标
{
for(int l=0;l<4;l++)//寻找相邻位置
{
int nx = j+dir[l].first, ny = k+dir[l].second;//找到相邻位置的坐标
if(nx>=0&&nx<m&&ny>=0&&ny<n)//如果相邻位置在矩阵内,参与状态转移
{
dp[j][k][i]+=dp[nx][ny][i-1];//状态转移
dp[j][k][i]%=mod;//取余
}
}
}
}
}
return dp[startRow][startColumn][maxMove];//返回从(startRow,startColumn),最大长度为maxMove,然后出界的情况有几种
}
};

该博客介绍了如何运用动态规划解决LeetCode上的'出界路径'问题。通过初始化边界条件和状态转移方程,计算从指定起点出发,在允许的最大步数内,以不同步数出界的路径数量。算法复杂度分析和优化策略也在讨论范围内。
1961

被折叠的 条评论
为什么被折叠?



