题目:给你一根长度为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]; }
割绳子 动态规划
最新推荐文章于 2022-04-20 11:41:19 发布