logologo

Bob Die

Nov 6, 2023

给定5个参数:N、M、row、col、k 表示在NxM的区域上,醉汉 Bob 初始在(row,col)位置 Bob 一共要迈出 k 步,且每一步都会等概率的向上下左右四个方向走一个单位,任何时候只要 Bob 离开NxM区域,就直接死亡 返回 k 步后,Bob 还在NxM的区域上的概率 Bob

暴力递归

public static double livePosibility1(int row, int col, int k, int N, int M) {
  return (double) process(row, col, k, N, M) / Math.pow(4, k);
}

/**
 * 目前在row,col位置,还有rest步要走,走完了如果还在棋盘中就获得1个生存点,返回总的生存点数
 *
 * @param row
 * @param col
 * @param rest
 * @param N
 * @param M
 * @return
 */
public static long process(int row, int col, int rest, int N, int M) {
  if (row < 0 || row == N || col < 0 || col == M) return 0;

  // 还在棋盘中!
  if (rest == 0)  return 1;

  // 还在棋盘中!还有步数要走
  long up = process(row - 1, col, rest - 1, N, M);
  long down = process(row + 1, col, rest - 1, N, M);
  long left = process(row, col - 1, rest - 1, N, M);
  long right = process(row, col + 1, rest - 1, N, M);
  return up + down + left + right;
}

DP

DP


public static double dp(int row, int col, int k, int N, int M) {
  long[][][] dp = new long[N][M][k + 1];

  for (int i = 0; i < N; i++) {
    for (int j = 0; j < M; j++) {
      dp[i][j][0] = 1;
    }
  }

  for (int rest = 1; rest <= k; rest++) {
    for (int r = 0; r < N; r++) {
      for (int c = 0; c < M; c++) {
        dp[r][c][rest] = pick(dp, N, M, r - 1, c, rest - 1);
        dp[r][c][rest] += pick(dp, N, M, r + 1, c, rest - 1);
        dp[r][c][rest] += pick(dp, N, M, r, c - 1, rest - 1);
        dp[r][c][rest] += pick(dp, N, M, r, c + 1, rest - 1);
      }
    }
  }

  return (double) dp[row][col][k] / Math.pow(4, k);
}

private static long pick(long[][][] dp, int N, int M, int r, int c, int rest) {
  if (r < 0 || r == N || c < 0 || c == M) {
    return 0;
  }
  return dp[r][c][rest];
}

C++Java
浙ICP备2021022773号    2022-PRESENT © ZhengKe