栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

动态规划练习—BobDie

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

动态规划练习—BobDie

题目

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

package com.harrison.class12;


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

    // 目前在(row,col)位置,还有rest步要走,走完了如果还在棋盘中就获得一个生存点,返回总的生存点数
    public static long process1(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 = process1(row - 1, col, rest - 1, N, M);
        long down = process1(row + 1, col, rest - 1, N, M);
        long left = process1(row, col - 1, rest - 1, N, M);
        long right = process1(row, col + 1, rest - 1, N, M);
        return up + down + left + right;
    }

    public static double livePosibility2(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, r - 1, c, rest - 1, N, M);
                    dp[r][c][rest] += pick(dp, r + 1, c, rest - 1, N, M);
                    dp[r][c][rest] += pick(dp, r, c - 1, rest - 1, N, M);
                    dp[r][c][rest] += pick(dp, r, c + 1, rest - 1, N, M);
                }
            }
        }
        return (double) dp[row][col][k] / Math.pow(4, k);
    }

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

    public static void main(String[] args) {
        System.out.println(livePosibility1(6, 6, 10, 50, 50));
        System.out.println(livePosibility2(6, 6, 10, 50, 50));
    }

}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/778779.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号