【剑指offer】剪绳子

剪绳子

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

贪心解法
把绳长target剪成i段的最大值为:Math.pow(n, i - c) * Math.pow(n + 1, c)
如:target=8 i=3时,ans=2^1*3^2
然后在剪成2段、3段...x段中取最大值即可。

public class Solution {
    public int cutRope(int target) {

        int result = 0;
        for (int i = 2; i <= target; i++) {
            int n = target / i, c = target % i;
            int ans = (int) (Math.pow(n, i - c) * Math.pow(n + 1, c));
            if (ans > result) {
                result = ans;
            }
        }
        return result;
    }
}

DP解法
f[i]表示长度为i的绳子的乘积最大值。
f[i] = Max{f[j]*f[i-j]} 0<j<i

public class Solution {
    public int cutRope(int target) {

        int[] dp = new int[target + 1];
        dp[0] = 1;
        dp[1] = 1;
        for (int i = 2; i <= target; i++) {
            if (i != target) { // 当i!=target时,长度为i的段也可以不分割!
                dp[i] = i;
            }
            for (int j = 1; j < i; j++) {
                dp[i] = Math.max(dp[i], dp[j] * dp[i - j]);
            }
        }
        return dp[target];
    }
}
全部评论
请问贪心最大值那个公式是怎么理解的
点赞 回复
分享
发布于 2020-02-15 22:11
大佬,最后dp算法,// 当i!=target时,长度为i的段也可以不分割! 因为限制了切的数目最少一刀,放在这里是不是会影响最后的结果
点赞 回复
分享
发布于 2020-04-01 10:37
联易融
校招火热招聘中
官网直投
大佬强,看懂贪心了
点赞 回复
分享
发布于 2020-07-31 17:09

相关推荐

头像
昨天 15:00
已编辑
算法工程师
点赞 评论 收藏
转发
4 1 评论
分享
牛客网
牛客企业服务