题解 | JAVA 数学 #求路径# [P3]

求路径

http://www.nowcoder.com/practice/166eaff8439d4cd898e3ba933fbc6358

DP解

import java.util.*;

public class Solution {
    public int uniquePaths (int m, int n) {
      int[][] mem = new int[m][n];
      // fill first row/col with 1
      Arrays.fill(mem[0], 1);
      for (int[] row : mem) row[0] = 1;
      
      for (int r = 1; r < m; r++) {
        for (int c = 1; c < n; c++) {
          mem[r][c] = mem[r-1][c] + mem[r][c-1];
        }
      }
      
      return mem[m-1][n-1];
    }
}

数学解 C(m+(n-1)-1, n-1)
具体为什么去看精华贴 这里就提供个java不overflow的implementation

import java.util.*;
import java.math.BigInteger;

public class Solution {
    public int uniquePaths (int m, int n) {
      if (m == 1 || n == 1) return 1;
      // C(m+(n-1)-1, n-1)
      //   = [(m+n-2)*...*n] / [(m-1)* ... *1]
      BigInteger numerator = BigInteger.valueOf(1);
      for (int i = n; i <= m+n-2; i++) {
        numerator = numerator.multiply(BigInteger.valueOf(i));
      }
      BigInteger denominator = BigInteger.valueOf(1);
      for (int i = 1; i <= m-1; i++) {
        denominator = denominator.multiply(BigInteger.valueOf(i));
      }
      return numerator.divide(denominator).intValue();
    }
}
DP是真的烦 文章被收录于专栏

只是为了把DP的题集中一下方便自己复习

全部评论

相关推荐

11-28 17:48
中山大学 C++
点赞 评论 收藏
分享
猪扒已出闸:方向不够聚焦,看不出来是想找什么方向的工作
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务