https://leetcode-cn.com/problems/jian-sheng-zi-ii-lcof/
思路比较简单。但该题的取值范围较大,直接使用int会溢出。
最直接的想法,用JAVA中的大数操作。
import java.math.*;
class Solution {
BigInteger[] dp = new BigInteger[1005];
BigInteger zero = new BigInteger("0");
BigInteger one = new BigInteger("1");
BigInteger two = new BigInteger("2");
BigInteger three = new BigInteger("3");
public int cuttingRope(int n) {
BigInteger N = new BigInteger(""+n);// 构建时输入的时字符串
dp[0] = zero;
dp[1] = one;
dp[2]= one;
dp[3]= two;
DP(N);
BigInteger mod = new BigInteger("1000000007");
return dp[n].mod(mod).intValue();// intValue
}
private BigInteger DP(BigInteger n){
int nv = n.intValue();// BigInteger 不能直接当int使用
if(dp[nv]== null){
dp[nv] = zero;
for(int i =1;i<nv;i++){
int a = nv-i;
BigInteger I = new BigInteger(""+i);
BigInteger A = new BigInteger(""+a);
dp[nv] = dp[nv].max(I.multiply(A));// 乘法
dp[nv] = dp[nv].max(I.multiply(DP(A)));
}
}
return dp[nv];
}
}
其他常见的操作
int intValue() 返回大整数的整型值
long longValue() 返回大整数的long型值
BigInteger max(BigInteger val) 返回两个大整数的最大者
BigInteger min(BigInteger val) 返回两个大整数的最小者
BigInteger mod(BigInteger val) 用当前大整数对val求模
BigInteger negate() 返回当前大整数的相反数
BigInteger abs() 返回大整数的绝对值
# 加减乘除
BigInteger add(BigInteger val) 返回两个大整数的和
BigInteger subtract(BigInteger val)返回两个大整数相减的结果
BigInteger multiply(BigInteger val) 返回两个大整数的积
BigInteger divide(BigInteger val) 返回两个大整数的商
BigInteger remainder(BigInteger val) 返回当前大整数除以val的余数
int compareTo(BigInteger) 比较大小 0等与,-1小于,1大于
String String.valueOf(BigInteger)