576. 出界的路径数

原题链接

题目描述

给你一个大小为 m x n 的网格和一个球。球的起始坐标为 [startRow, startColumn] 。你可以将球移到在四个方向上相邻的单元格内(可以穿过网格边界到达网格之外)。你 最多 可以移动 maxMove 次球。
给你五个整数 m、n、maxMove、startRow 以及 startColumn ,找出并返回可以将球移出边界的路径数量。因为答案可能非常大,返回对 109 + 7 取余 后的结果。
示例 1:
在这里插入图片描述
输入:m = 2, n = 2, maxMove = 2, startRow = 0, startColumn = 0
输出:6
提示
1 <= m, n <= 50
0 <= maxMove <= 50
0 <= startRow < m
0 <= startColumn < n

解题:
方法1 动态规划
class Solution(object):
    def findPaths(self, m, n, maxMove, startRow, startColumn):
    	# 四个方向
        dirs = [[0, 1], [0, -1], [1, 0], [-1, 0]]
        # dp[i][j][k]表示移动i步能够到达(i,j)的路径数
        dp = [[[0 for _ in range(n)] for _ in range(m)] for _ in range(maxMove + 1)]
        # 动态规划边界情况
        dp[0][startRow][startColumn] = 1
        ans = 0
        MOD = 1e9 + 7
        for i in range(maxMove):
            for j in range(m):
                for k in range(n):
                    for dir in dirs:
                        newR, newC = j + dir[0], k + dir[1]
                        if newR >= m or newR <= -1 or newC >= n or newC <= -1:
                            ans += dp[i][j][k]
                            ans %= MOD
                        else:
                            dp[i + 1][newR][newC] += dp[i][j][k]
                            dp[i + 1][newR][newC] %= MOD
        return int(ans)
方法2 dfs+记忆化搜索

(这种方法用时最少)

class Solution(object):
    def findPaths(self, m, n, maxMove, startRow, startColumn):
        MOD = 1e9 + 7
        dp = [[[-1 for _ in range(n)] for _ in range(m)] for _ in range(maxMove + 1)]
        def dfs(x, y, k):
        	# 到达边界的情况
            if x < 0 or x >= m or y < 0 or y >= n:
                return 1
            # 没有到达边界但是剩余步数已经不够的情况
            if k == 0:
                return 0
            # 如果之前计算过dp[k][x][y]的值,就直接返回,从而实现记忆化搜索
            if dp[k][x][y] != -1:
                return dp[k][x][y]
            dp[k][x][y] = (dfs(x - 1, y, k - 1) + dfs(x, y - 1, k - 1) + dfs(x + 1, y, k - 1) + dfs(x, y + 1, k - 1)) % MOD
            return dp[k][x][y]
        return int(dfs(startRow, startColumn, maxMove))
队列实现BFS
class Solution(object):
    def findPaths(self, m, n, maxMove, startRow, startColumn):
        q = [(startRow, startColumn)]
        dirs = [(0, 1), (0, -1), (1, 0), (-1, 0)]
        dp = [[0 for _ in range(n)] for _ in range(m)]
        dp[startRow][startColumn] = 1
        ans = 0
        MOD = 1e9 + 7
        for _ in range(maxMove): #遍历每种步数
            length = len(q)
            for _ in range(length): #遍历相同步数能够到达的点的情况
                (tmpR, tmpC) = q.pop(0)
                for dir in dirs:
                    newR, newC = tmpR + dir[0], tmpC + dir[1]
                    if newC == -1 or newC == n or newR == -1 or newR == m:
                        ans = (ans + dp[tmpR][tmpC]) % MOD
                    else:
                        if dp[newR][newC] == 0: 
                            q.append((newR, newC))
                        dp[newR][newC] = (dp[newR][newC] + dp[tmpR][tmpC]) % MOD
                dp[tmpR][tmpC] = 0
        return int(ans)
内容概要:本文档主要介绍了Intel Edge Peak (EP) 解决方案,涵盖从零到边缘高峰的软件配置和服务管理。EP解决方案旨在简化客户的入门门槛,提供一系列工具和服务,包括Edge Software Provisioner (ESP),用于构建和缓存操作系统镜像和软件栈;Device Management System (DMS),用于远程集群或本地集群管理;以及Autonomous Clustering for the Edge (ACE),用于自动化边缘集群的创建和管理。文档详细描述了从软件发布、设备制造、运输、安装到最终设备激活的全过程,并强调了在不同应用场景(如公共设施、工业厂房、海上油井和移动医院)下的具体部署步骤和技术细节。此外,文档还探讨了安全设备注册(FDO)、集群管理、密钥轮换和备份等关键操作。 适合人群:具备一定IT基础设施和边缘计算基础知识的技术人员,特别是负责边缘设备部署和管理的系统集成商和运维人员。 使用场景及目标:①帮助系统集成商和客户简化边缘设备的初始配置和后续管理;②确保设备在不同网络环境下的安全启动和注册;③支持大规模边缘设备的自动化集群管理和应用程序编排;④提供详细的密钥管理和集群维护指南,确保系统的长期稳定运行。 其他说明:本文档是详细描述了Edge Peak技术及其应用案例。文档不仅提供了技术实现的指导,还涵盖了策略配置、安全性和扩展性的考虑,帮助用户全面理解和实施Intel的边缘计算解决方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值