Leetcode 576.出界的路劲数

Posted kexinxin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Leetcode 576.出界的路劲数相关的知识,希望对你有一定的参考价值。

出界的路径数

给定一个 m × n 的网格和一个球。球的起始坐标为 (i,j) ,你可以将球移到相邻的单元格内,或者往上、下、左、右四个方向上移动使球穿过网格边界。但是,你最多可以移动 次。找出可以将球移出边界的路径数量。答案可能非常大,返回 结果 mod 109 + 7 的值。

   

示例 1:

输入: m = 2, n = 2, N = 2, i = 0, j = 0

输出: 6

解释:

示例 2:

输入: m = 1, n = 3, N = 3, i = 0, j = 1

输出: 12

解释:

   

说明:

  1. 球一旦出界,就不能再被移动回网格内。
  2. 网格的长度和高度在 [1,50] 的范围内。
  3. N 在 [0,50] 的范围内。

思路

以(i, j)为起始点,其中dp[k][x][y]表示用了k步,进入(x, y)位置的路径数,由于dp[k][x][y]只依赖于dp[k-1][x][y],所以我们可以用一个二维dp数组来代替,初始化dp[i][j]为1,总共N步,进行N次循环,每次都新建一个mxn大小的临时数组t,然后就是对于遍历到的每个位置,都遍历其四个相邻位置,如果相邻位置越界了,那么我们用当前位置的dp值更新结果res,因为此时dp值的意义就是从(i,j)到越界位置的路径数。如果没有,我们将当前位置的dp值赋给t数组的对应位置,这样在遍历完所有的位置时,将数组t整个赋值给dp,然后进入下一步的循环。

 

 1 class Solution {
 2     public int findPaths(int m, int n, int N, int x, int y) {
 3         int M=1000000007;
 4         int[][] dp=new int[m][n];
 5         int[][] dt={{-1,0},{1,0},{0,-1},{0,1}};
 6         dp[x][y]=1;
 7         int res=0;
 8         for(int k=0;k<N;k++){
 9             int[][] t=new int[m][n];
10             for(int i=0;i<m;i++){
11                 for(int j=0;j<n;j++){
12                     for(int[] d:dt){
13                         int r=i+d[0];
14                         int c=j+d[1];
15                         if(r<0||r>=m||c<0||c>=n)
16                             res=(res+dp[i][j])%M;
17                         else
18                             t[r][c]=(t[r][c]+dp[i][j])%M;
19                     }
20                 }
21             }
22             dp=t;
23         }
24         return res;
25     }
26 }

 

以上是关于Leetcode 576.出界的路劲数的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 576 出界的路径数[动态规划 状态机] HERODING的LeetCode之路

leetcode刷题(129)——576. 出界的路径数

LeetCode 576. 出界的路径数(动规) / 526. 优美的排列(全排列,状压dp)

mybatis中出现Cause: org.apache.ibatis.builder.BuilderException的解决思路

LeetCode236-最早公共祖先(递归)

ASP.NET 图片上传为啥传上出去了 但是显示不出来 我用的ACCESS数据库 图片的路劲已经传到了数据库里,