688. 骑士在棋盘上的概率

2024-02-25 22:12
文章标签 棋盘 概率 骑士 688

本文主要是介绍688. 骑士在棋盘上的概率,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Problem: 688. 骑士在棋盘上的概率

文章目录

  • 思路
  • 解题方法
  • 复杂度
  • Code

思路

这是一个动态规划问题。我们需要计算骑士在棋盘上移动k次后仍然留在棋盘上的概率。骑士的每一步都有8种可能的移动方式,因此我们可以使用一个三维数组dp[i][j][k]来存储骑士在第k步时位于棋盘的(i, j)位置的概率。

解题方法

初始化一个三维数组dp,其中dp[i][j][k]表示骑士在第k步时位于棋盘的(i, j)位置的概率。初始时,所有的dp[i][j][k]都设为-1,表示未计算。
定义一个递归函数f,用于计算骑士在第k步时位于棋盘的(i, j)位置的概率。如果(i, j)位置不在棋盘上,那么概率为0;如果k为0,那么概率为1;否则,概率为骑士从(i, j)位置移动到棋盘上的其他位置的概率之和,每种移动方式的概率都是1/8。
在递归函数f中,如果dp[i][j][k]不为-1,那么直接返回dp[i][j][k],否则计算dp[i][j][k]的值,并将其存入dp数组中。
最后,返回dp[row][col][k],即骑士在第k步时位于棋盘的(row, col)位置的概率。

复杂度

时间复杂度:

由于我们需要计算每个位置在每一步的概率,所以时间复杂度为 O ( n 2 ∗ k ) O(n^2 * k) O(n2k),其中 n n n 为棋盘的大小, k k k 为移动的步数。

空间复杂度:

我们使用了一个三维数组 d p dp dp 来存储每个位置在每一步的概率,所以空间复杂度为 O ( n 2 ∗ k ) O(n^2 * k) O(n2k)

Code

class Solution {public double knightProbability(int n, int k, int row, int col) {double[][][] dp = new double[n][n][k + 1];for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {for (int t = 0; t <= k; t++) {dp[i][j][t] = -1;}}}return f(n, row, col, k, dp);}public double f(int n, int i, int j, int k, double[][][] dp) {if (i < 0 || i >= n || j < 0 || j >= n) {return 0;}if(dp[i][j][k] != -1) {return dp[i][j][k];}double ans = 0;if (k == 0) {ans = 1;} else {ans += (f(n, i - 2, j + 1, k - 1, dp) / 8);ans += (f(n, i - 1, j + 2, k - 1, dp) / 8);ans += (f(n, i + 1, j + 2, k - 1, dp) / 8);ans += (f(n, i + 2, j + 1, k - 1, dp) / 8);ans += (f(n, i + 2, j - 1, k - 1, dp) / 8);ans += (f(n, i + 1, j - 2, k - 1, dp) / 8);ans += (f(n, i - 1, j - 2, k - 1, dp) / 8);ans += (f(n, i - 2, j - 1, k - 1, dp) / 8);}dp[i][j][k] = ans; return ans;}
}

这篇关于688. 骑士在棋盘上的概率的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/746871

相关文章

概率之常用概率分布

1. Bernoulli分布 单个二值随机变量的分布。它由单个参数控制,给出了随机变量等于1的概率。它具有如下的一些性质。 2. Multinoulli分布 Multinoulli分布(multinoulli distribution)或者范畴分布(categorical distribution)是指在具有k个不同状态的单个离散型随机变量上的分布,其中k是一个有限值。

概率之基础概念

1 概率分布(probability distribution) 用来描述随机变量或一簇随机变量在每一个可能取到的状态的可能性大小。描述概率分布的方式取决于随机变量是离散的还是连续的。 离散型变量和概率质量函数(probability mass function, PMF) 离散型随机变量的概率分布可以用PMF来描述。通常使用大写字母P来表示PMF。例如。 PMF将随机变量能够取得的每个状

概率p输出1,概率1-p输出0,等概率输出0和1

有个输出0和1的BIASED RANDOM,它以概率p输出1,以概率1-p输出0,以此RANDOM函数为基础,生成另一个RANDOM函数,该函数以1/2的概率输出1,以1/2的概率输出0 题目解答: 两次调用该RANDOM函数,如果其概率为P(x),调用2次 P(1) = p       P(0) = 1-p P'(1) =p      P'(0) = 1-p 概率如下: 11

Matlab 单目相机标定(内置函数,棋盘格)

文章目录 一、简介二、实现代码三、实现效果参考资料 一、简介 具体的标定原理可以参阅之前的博客Matlab 单目相机标定(内置函数),这里实现对棋盘格数据的标定过程。 二、实现代码 getCameraCorners.m function [camCorners, usedImIdx, imCheckerboard] = getCameraCorners(cali

头歌资源库(14)残缺棋盘

一、 问题描述  二、算法思想   首先,将2^k × 2^k的棋盘划分为四个相等大小的子棋盘,定义为左上、左下、右上和右下四个子棋盘。 然后,根据残缺格的坐标,确定其中一个子棋盘是不完整的,即残缺子棋盘。假设残缺子棋盘是左上子棋盘。 接下来,分以下三种情况进行处理: 当k=1时,即棋盘大小为2×2时,直接填充序号即可。 当残缺子棋盘的坐标位于左上子棋盘的右下角时,将左上子棋盘的

[LightOJ 1321] Sending Packets (SPFA+概率DP)

LightOJ - 1321 给定一张无向图,每条边都有一个通过的概率 如果无法通过,那么就要回到起点重新出发 从起点到终点的时间固定为 K K,如果成功到达, 又需要额外花费 KK的时间,问走 S S次的最小期望时间首先可以跑一遍SPFA求出一次通过的最大概率 pp 设跑一次的最小期望时间为 E E,E=p×2K+(1−p)×(E+2K)E = p\times 2K + (1-

[LightOJ 1265] Island of Survival (概率)

LightOJ - 1265 一个岛上有若干只虎,若干只鹿,一个人 每天只有两个动物会相见 如果人和虎相见,人死 如果鹿和虎相见,鹿死 如果虎和虎相见,虎死 其他情况均没有伤亡,各种情况均等概率 问人活到虎全死光的概率有多少 感觉二维dp直接搞正确性很显然 但是网上有另一种做法,就是直接忽略掉鹿的存在,当没有鹿 不是很懂这样做的正确性,网上的解释是鹿吃与被吃, 与人

Day 27:2596. 检查骑士巡视方案

Leetcode 2596. 检查骑士巡视方案 骑士在一张 n x n 的棋盘上巡视。在 **有效 **的巡视方案中,骑士会从棋盘的 左上角 出发,并且访问棋盘上的每个格子 恰好一次 。 给你一个 n x n 的整数矩阵 grid ,由范围 [0, n * n - 1] 内的不同整数组成,其中 grid[row][col] 表示单元格 (row, col) 是骑士访问的第 grid[row][

一个抽奖函数(自定义中奖项数和概率)

<? /* * 一个抽奖类,精确到万分之一 * 三个步骤:1.接受一个中奖概率数组;2.接受一个抽奖种子;3.返回中奖等级 */ class Lottery { /* * 中奖概率数组,自动判断奖项数目 * 数组键值和为100,自动计算出不中奖的概率,若初始是超过100抛出一个错误 */ protected $_rate = array(); /* * 设置中奖概率, * @param Ar

利用随机数实现指定概率抽奖

一、随机数与概率的规律 假设我们使用随机数生成器,可以产生1-100范围内随机数。 那么每次产生的随机数,其值可能是1-100范围内任意一个数,每个数的概率均等。 所以可以得出,随机数值V与概率P,有如下规律: 数值(V)概率(P)1 <= V <= 100100%V < 1 或 V > 1000%1 <= V <= 5050%50 <= V <= 10050%1 <= V <= 2020