JZ67 剪绳子,动态规划法 & 数学公式法

剪绳子

http://www.nowcoder.com/questionTerminal/57d85990ba5b440ab888fc72b0751bf8

解法一:动态规划

尤其注意!!
最开始的几个特殊值!!
n==2, return 1,
n==3, return 2.
验证了最开始的这些特殊值,循环才能平稳地走下去。

注意,如果用这种写法,dp[i]中储存的元素不能小于i本身。
然而只有n==4时,2*2=4才不小于4,所以要手动填充dp[1],dp[2],dp[3]。

public class Solution {
    public int cutRope(int target) {
        if(target==2) return 1;
        if(target==3) return 2;
        int[] dp=new int[target+1];
        dp[1]=1; dp[2]=2; dp[3]=3; 
        for(int i=4; i<target+1; i++){
            for(int j=1; j<i; j++)
                dp[i]=Math.max(dp[i], dp[i-j]*j);
        }
        return dp[target];
    }
}

解法二:数学公式法

非原创,原出处见
https://www.nowcoder.com/questionTerminal/57d85990ba5b440ab888fc72b0751bf8?answerType=1&f=discussion
速度比动态规划快一倍。
实在是太强了!

import java.util.*;
public class Solution {
    public int cutRope(int target) {
        if(target<=0) return 0;
        if(target==1 || target == 2) return 1;
        if(target==3) return 2;
        int m = target % 3;
        switch(m){
            case 0 :
                return (int) Math.pow(3, target / 3);
            case 1 :
                return (int) Math.pow(3, target / 3 - 1) * 4;
            case 2 :
                return (int) Math.pow(3, target / 3) * 2;
        }
        return 0;
    }
}
全部评论
第二个用switch简直牛批
点赞 回复 分享
发布于 2020-07-17 15:01
第一个通过不 了
点赞 回复 分享
发布于 2020-06-27 20:32

相关推荐

菠落蜜:这个是系统自动投的,不是hr主动打招呼。更抽象的还有ai回复
我的秋招日记
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务