题目描述
现在有两个好友A和B,住在一片长有蘑菇的由n*m个方格组成的草地,A在(1,1),B在(n,m)。现在A想要拜访B,由于她只想去B的家,所以每次她只会走(i,j+1)或(i+1,j)这样的路线,在草地上有k个蘑菇种在格子里(多个蘑菇可能在同一方格),问:A如果每一步随机选择的话(若她在边界上,则只有一种选择),那么她不碰到蘑菇走到B的家的概率是多少?
输入描述:
第一行N,M,K(2 ≤ N,M ≤ 20, k ≤ 100),N,M为草地大小,接下来K行,每行两个整数x,y,代表(x,y)处有一个蘑菇。
输出描述:
输出一行,代表所求概率(保留到2位小数)
输入例子:
2 2 1
2 1
输出例子:
0.50
思路:一开始用可行路径除以所有路径去做,发现是错的,因为不同路径的概率是不一样的。这题还得用概率进行动态规划。
1 import java.util.*; 2 /** 3 * Created by Jiang on 2016/5/27. 4 */ 5 public class Solution { 6 public static void main(String[] args) { 7 double[][] dp = new double[21][21]; 8 Scanner in = new Scanner(System.in); 9 while (in.hasNext()) { 10 int N = in.nextInt(); 11 int M = in.nextInt(); 12 int K = in.nextInt(); 13 for (int i = 0; i < 21; i++) { 14 Arrays.fill(dp[i], 0); 15 } 16 for (int col = 0; col < K; col++) { 17 int x = in.nextInt(); 18 int y = in.nextInt(); 19 dp[x][y] = 1; 20 } 21 //通过从1开始遍历,省去对第0行,0列的特殊处理。 22 for (int col = 1; col <= M; col++) { 23 for (int row = 1; row <= N; row++) { 24 if (dp[row][col] == 1) { 25 dp[row][col] = 0; 26 } 27 //第一个元素 28 else if (row == 1 && col == 1) { 29 dp[row][col] = 1; 30 } 31 //最后一个元素 32 else if (row == N && col == M) { 33 dp[row][col] = dp[row - 1][col] + dp[row][col - 1]; 34 } 35 //最后一行 36 else if (row == N) { 37 dp[row][col] = 0.5 * dp[row - 1][col] + dp[row][col - 1]; 38 } 39 //最后一列 40 else if (col == M) { 41 dp[row][col] = dp[row - 1][col] + 0.5 * dp[row][col - 1]; 42 } 43 else { 44 dp[row][col] = 0.5 * (dp[row - 1][col] + dp[row][col - 1]); 45 } 46 } 47 } 48 System.out.println(String.format("%.2f", 1.0 * dp[N][M])); 49 } 50 } 51 }