割绳子 动态规划

题目:给你一根长度为n的绳子,请把绳子剪成m段 (m和n都是整数,n>1并且m>1),至少剪一次。每段绳子的长度记为k[0],k[1],…,k[m]. 请问k[0]k[1]…*k[m]可能的最大乘积是多少?例如,当绳子的长度为8时,我们把它剪成长度分别为2,3,3的三段,此时得到的最大乘积是18.

思路:dp[i] = max(dp[j]*[i-j])(j 属于 1-N/2,i 属于 4-N) 


public static int cutRope(int N) {
    if(N <= 1)
        return 0;
    if(N == 2)
        return 1;
    if(N == 3)
        return 2;

    int[] dp = new int[N+1];
    dp[0] = 0;
    dp[1] = 1;
    dp[2] = 2;
    dp[3] = 3;

    for(int i = 4;i <= N;i++) {
        int max = 0;
        for(int j = 1; j <= N/2;j++) {
            if(i >= j) { //这一步主要是防止 如果N=10这样的情况,j在1-5循环,当i=4的时候会超出长度,防止切多了
                int temp = dp[j]*dp[i-j];
                if(max < temp)
                    max = temp;
            }
        }
        dp[i] = max;
    }

    return dp[N];
}

你可能感兴趣的:(秋招复习)