leetcode 剑指 Offer 14- II. 剪绳子 II 动态规划+大数操作

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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值