Java实现 LeetCode 576 出界的路径数(DFS || DP)
576. 出界的路径数
给定一个 m × n 的网格和一个球。球的起始坐标为 (i,j) ,你可以将球移到相邻的单元格内,或者往上、下、左、右四个方向上移动使球穿过网格边界。但是,你最多可以移动 N 次。找出可以将球移出边界的路径数量。答案可能非常大,返回 结果 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,50] 的范围内。
N 在 [0,50] 的范围内。
PS:
小编的传统的DFS
大佬弄得动态规划
class Solution {
private Integer[][][] cache;
public int findPaths(int m, int n, int N, int i, int j) {
cache = new Integer[m][n][N+1];
return dfs(m,n,N,j,i);
}
private int dfs(int rows,int cols,int times,int x,int y) {
if (isOutOfBoundary(x,y,rows,cols)) {
return 1;
}
if (0 == times) {
return 0;
}
if (null != cache[y][x][times]) {
return cache[y][x][times];
}
int res = (((dfs(rows,cols,times-1,x+1,y) + dfs(rows,cols,times-1,x-1,y)) % 1000000007) + ((dfs(rows,cols,times-1,x,y+1) + dfs(rows,cols,times-1,x,y-1)) % 1000000007)) % 1000000007;
cache[y][x][times] = res;
return res;
}
private boolean isOutOfBoundary(int x,int y,int rows,int cols) {
return x < 0 || x >= cols || y < 0 || y >= rows;
}
}
class Solution {
public int findPaths(int m, int n, int N, int i, int j) {
if(N <= 0) return 0;
int mod = 1000000007;
int ret = 0;
int[][] dp = new int[m][n]; // 保存第k步的结果
int[][] dirs = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
for(int k = 1; k <= N; ++k) {
int[][] temp = new int[m][n]; // 保存第k-1步的结果
for(int x = 0; x < m; ++x) {
for(int y = 0; y < n; ++y) {
for(int[] dir : dirs) {
int nx = x + dir[0];
int ny = y + dir[1];
if(nx < 0 || nx >= m || ny < 0 || ny >= n)
temp[x][y] += 1;
else
temp[x][y] = (dp[nx][ny] + temp[x][y]) % mod;
}
}
}
dp = temp;
}
return dp[i][j];
}
}
Java实现 LeetCode 576 出界的路径数(DFS || DP)的更多相关文章
- Python算法之动态规划(Dynamic Programming)解析:二维矩阵中的醉汉(魔改版leetcode出界的路径数)
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_168 现在很多互联网企业学聪明了,知道应聘者有目的性的刷Leetcode原题,用来应付算法题面试,所以开始对这些题进行" ...
- Leetcode 576.出界的路劲数
出界的路径数 给定一个 m × n 的网格和一个球.球的起始坐标为 (i,j) ,你可以将球移到相邻的单元格内,或者往上.下.左.右四个方向上移动使球穿过网格边界.但是,你最多可以移动 N 次.找出可 ...
- [Swift]LeetCode576. 出界的路径数 | Out of Boundary Paths
There is an m by n grid with a ball. Given the start coordinate (i,j) of the ball, you can move the ...
- Java实现 LeetCode 120 三角形最小路径和
120. 三角形最小路径和 给定一个三角形,找出自顶向下的最小路径和.每一步只能移动到下一行中相邻的结点上. 例如,给定三角形: [ [2], [3,4], [6,5,7], [4,1,8,3] ] ...
- Java实现 LeetCode 504 七进制数
504. 七进制数 给定一个整数,将其转化为7进制,并以字符串形式输出. 示例 1: 输入: 100 输出: "202" 示例 2: 输入: -7 输出: "-10&qu ...
- Java实现 LeetCode 479 最大回文数乘积
479. 最大回文数乘积 你需要找到由两个 n 位数的乘积组成的最大回文数. 由于结果会很大,你只需返回最大回文数 mod 1337得到的结果. 示例: 输入: 2 输出: 987 解释: 99 x ...
- Java实现 LeetCode 414 第三大的数
414. 第三大的数 给定一个非空数组,返回此数组中第三大的数.如果不存在,则返回数组中最大的数.要求算法时间复杂度必须是O(n). 示例 1: 输入: [3, 2, 1] 输出: 1 解释: 第三大 ...
- Java实现 LeetCode 834 树中距离之和(DFS+分析)
834. 树中距离之和 给定一个无向.连通的树.树中有 N 个标记为 0-N-1 的节点以及 N-1 条边 . 第 i 条边连接节点 edges[i][0] 和 edges[i][1] . 返回一个表 ...
- Java实现 LeetCode 823 带因子的二叉树(DP)
823. 带因子的二叉树 给出一个含有不重复整数元素的数组,每个整数均大于 1. 我们用这些整数来构建二叉树,每个整数可以使用任意次数. 其中:每个非叶结点的值应等于它的两个子结点的值的乘积. 满足条 ...
随机推荐
- Python3+Pycharm+PyQt5环境搭建步骤
搭建环境: 操作系统:Win10 64bit Python版本:3.7 Pycharm:社区免费版 一.Python3.7安装 下载链接:官网 https://www.python.org/downl ...
- Cannot parse "1986-05-04": Illegal instant due to time zone offset transition (Asia/Shanghai)
调查系统错误时,发现了一个很奇怪的现象,出生日期1986-05-04号的用户始终无法注册.发现后台使用使用jodatime的代码demo如下: public static DateTime parse ...
- JQuery踩过的坑,遇到就记下
1 乱用选择器 坑人指数:200 JQuery选择器调用代价很大,反复调用效率更低.应采用缓存对象的方法或采用链式调用的方式. //错误的写法 $("#button").click ...
- abp(net core)+easyui+efcore实现仓储管理系统——入库管理之十二(四十八)
abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统——ABP总体介绍(一) abp(net core)+ ...
- reids不重启切换rdb到aof
reids不重启切换rdb到aof
- 安装sql_server_2008问题
http://support.microsoft.com/kb/968382 --安装sql_server_2008_R2提示重启计算机规则失败 http://blog.sina.com.cn/s/b ...
- vue打包时semver.js版本报错
如图,报错semver.js版本不正确,解决思路是在node_modules/semver.js内,忽略版本检查 ''' // if ANY of the sets match ALL of its ...
- Vue零基础入门记录
在2020年这个开局不利的年份毕业,实习工作都很难得.最近来到一家单位,为了减小开支实习生过来了的话前端后端都要写.用Vue和ElementUI做界面.以前的前端vue了解还停留在new一个Vue实例 ...
- MarkDown语法使用(效果版本)
function syntaxHighlighting() { var n = 33; var s = "hello, こんにちは"; console.log(s); } plai ...
- Android中的多进程、多线程
前面几篇总结了进程.线程相关的知识.这里总结下关于Android中的多进程.多线程及其使用. 这里总结的Android中的多进程.多线程也是一个基础,可扩展的很多. Android中多进程 常见的几种 ...