golang力扣leetcode 688.骑士在棋盘上的概率

简介: golang力扣leetcode 688.骑士在棋盘上的概率

688.骑士在棋盘上的概率

688.骑士在棋盘上的概率

题解

两种解法,dp和dfs+memory,一样的思路

dp[step][i][j]即当前步数的概率,当前步数是由上一步的概率叠加来的,当前的位置=上一步的8个位置,理解这句话问题就迎刃而解了

代码

package main
func knightProbabilityDP(n int, k int, row int, column int) float64 {
  var dirs = []struct{ i, j int }{{-2, -1}, {-2, 1}, {2, -1}, {2, 1}, {-1, -2}, {-1, 2}, {1, -2}, {1, 2}}
  dp := make([][][]float64, k+1)
  for step := range dp {
    dp[step] = make([][]float64, n)
    for i := 0; i < n; i++ {
      dp[step][i] = make([]float64, n)
      for j := 0; j < n; j++ {
        if step == 0 {
          dp[step][i][j] = 1
        } else {
          for _, d := range dirs {
            prevX, pervY := i+d.i, j+d.j
            if prevX >= 0 && prevX < n && pervY >= 0 && pervY < n {
              dp[step][i][j] += dp[step-1][prevX][pervY] / 8
            }
          }
        }
      }
    }
  }
  return dp[k][row][column]
}
func knightProbabilityDfsAndMemory(n int, k int, row int, column int) float64 {
  var dirs = []struct{ i, j int }{{-2, -1}, {-2, 1}, {2, -1}, {2, 1}, {-1, -2}, {-1, 2}, {1, -2}, {1, 2}}
  memory := make([][][]float64, k+1)
  for i := range memory {
    memory[i] = make([][]float64, n)
    for j := range memory[i] {
      memory[i][j] = make([]float64, n)
    }
  }
  var dfs func(n int, k int, row int, column int) float64
  dfs = func(n int, k int, row int, column int) float64 {
    if k == 0 {
      return 1
    }
    if memory[k][row][column] != 0 {
      return memory[k][row][column]
    }
    for _, d := range dirs {
      prevX, prevY := row+d.i, column+d.j
      if prevX >= 0 && prevX < n && prevY >= 0 && prevY < n {
        memory[k][row][column] += dfs(n, k-1, prevX, prevY) / 8
      }
    }
    return memory[k][row][column]
  }
  return dfs(n, k, row, column)
}
目录
相关文章
|
18天前
|
存储 SQL 算法
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
|
18天前
|
算法 数据可视化 数据挖掘
最佳加油站选择算法:解决环路加油问题的两种高效方法|LeetCode力扣134
最佳加油站选择算法:解决环路加油问题的两种高效方法|LeetCode力扣134
|
18天前
|
存储 算法 数据可视化
LeetCode 力扣题目:买卖股票的最佳时机 IV
LeetCode 力扣题目:买卖股票的最佳时机 IV
|
18天前
|
存储 算法 数据可视化
LeetCode 力扣题目:买卖股票的最佳时机 III
LeetCode 力扣题目:买卖股票的最佳时机 III
|
18天前
|
存储 缓存 算法
LeetCode力扣题目111:多种算法对比实现二叉树的最小深度
LeetCode力扣题目111:多种算法对比实现二叉树的最小深度
|
1月前
|
监控 算法 Go
Golang深入浅出之-Go语言中的服务熔断、降级与限流策略
【5月更文挑战第4天】本文探讨了分布式系统中保障稳定性的重要策略:服务熔断、降级和限流。服务熔断通过快速失败和暂停故障服务调用来保护系统;服务降级在压力大时提供有限功能以保持整体可用性;限流控制访问频率,防止过载。文中列举了常见问题、解决方案,并提供了Go语言实现示例。合理应用这些策略能增强系统韧性和可用性。
122 0
|
1月前
|
前端开发 Go
Golang深入浅出之-Go语言中的异步编程与Future/Promise模式
【5月更文挑战第3天】Go语言通过goroutines和channels实现异步编程,虽无内置Future/Promise,但可借助其特性模拟。本文探讨了如何使用channel实现Future模式,提供了异步获取URL内容长度的示例,并警示了Channel泄漏、错误处理和并发控制等常见问题。为避免这些问题,建议显式关闭channel、使用context.Context、并发控制机制及有效传播错误。理解并应用这些技巧能提升Go语言异步编程的效率和健壮性。
65 5
Golang深入浅出之-Go语言中的异步编程与Future/Promise模式
|
1月前
|
Prometheus 监控 Cloud Native
Golang深入浅出之-Go语言中的分布式追踪与监控系统集成
【5月更文挑战第4天】本文探讨了Go语言中分布式追踪与监控的重要性,包括追踪的三个核心组件和监控系统集成。常见问题有追踪数据丢失、性能开销和监控指标不当。解决策略涉及使用OpenTracing或OpenTelemetry协议、采样策略以及聚焦关键指标。文中提供了OpenTelemetry和Prometheus的Go代码示例,强调全面可观测性对微服务架构的意义,并提示选择合适工具和策略以确保系统稳定高效。
165 5
|
1月前
|
监控 负载均衡 算法
Golang深入浅出之-Go语言中的协程池设计与实现
【5月更文挑战第3天】本文探讨了Go语言中的协程池设计,用于管理goroutine并优化并发性能。协程池通过限制同时运行的goroutine数量防止资源耗尽,包括任务队列和工作协程两部分。基本实现思路涉及使用channel作为任务队列,固定数量的工作协程处理任务。文章还列举了一个简单的协程池实现示例,并讨论了常见问题如任务队列溢出、协程泄露和任务调度不均,提出了解决方案。通过合理设置缓冲区大小、确保资源释放、优化任务调度以及监控与调试,可以避免这些问题,提升系统性能和稳定性。
65 6
|
1月前
|
负载均衡 算法 Go
Golang深入浅出之-Go语言中的服务注册与发现机制
【5月更文挑战第4天】本文探讨了Go语言中服务注册与发现的关键原理和实践,包括服务注册、心跳机制、一致性问题和负载均衡策略。示例代码演示了使用Consul进行服务注册和客户端发现服务的实现。在实际应用中,需要解决心跳失效、注册信息一致性和服务负载均衡等问题,以确保微服务架构的稳定性和效率。
37 3