动态规划_出界路径数

576. 出界的路径数

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

memo = {}
def helper(N, i, j):
	if (N, i, j) in memo: return memo[(N, i, j)]
	if N == 0: return 0
	ans = 0
	for x, y in [(0, 1), (1, 0), (0, -1), (-1, 0)]:
		if i + x >= 0 and i + x < m and j + y >= 0 and j + y < n:
			ans += helper(N-1, i + x, j + y)
		else:
			ans += 1
		memo[(N, i, j)] = ans
		return ans
return helper(N, i, j) % (10**9 + 7)

688. "马"在棋盘上的概率

描述:已知一个 NxN 的国际象棋棋盘,棋盘的行号和列号都是从 0 开始。即最左上角的格子记为 (0, 0),最右下角的记为 (N-1, N-1)。

现有一个 “马”(也译作 “骑士”)位于 (r, c) ,并打算进行 K 次移动。

如下图所示,国际象棋的 “马” 每一步先沿水平或垂直方向移动 2 个格子,然后向与之相垂直的方向再移动 1 个格子,共有 8 个可选的位置。
现在 “马” 每一步都从可选的位置(包括棋盘外部的)中独立随机地选择一个进行移动,直到移动了 K 次或跳到了棋盘外面。

求移动结束后,“马” 仍留在棋盘上的概率。

moves = [(1, 2), (2, 1), (2, -1), (1, -2), (-1, -2), (-2, -1), (-2, 1), (-1, 1)]
memo = {}
def check(i, j, k):
	if i < 0 or i >= N or j < 0 or j >= N:
		return 0
	if k == 0:
		return 1
	if (i, j, k) in memo:
		return memo[(i, j, k)]
	p = 1 / float(8)
	s = 0
	for di, dj in moves:
		x, y = i + di, j + dj
		s += p * check(x, y, k - 1)
	memo[(i, j, k)] = s
	return s
return check(r, c, K)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值