题目
思路
dp[i] 代表长度为i的绳子获得的最大乘积
那么对于长度为i的绳子,就有两种剪法
① 剪去长度j,剩下的绳子不再剪,乘积为 j * (i - j)
② 剪去长度j,剩下的绳子继续剪,剪出剩下绳子能获得的最大乘积,即dp[i - j]
然后比较这两种剪法,取最大乘积者即可。
class Solution {
public int cuttingRope(int n) {
int[] dp = new int[n + 1];
dp[1] = 1;
dp[2] = 1;
// dp[1] dp[2] 已知,从3开始
for (int i = 3;i <= n;i++) {
// 因为剪长度为1的绳子没什么用,所以从2开始
for (int j = 2;j < i;j++) {
dp[i] = Math.max(dp[i], Math.max(j * (i - j), j * dp[i - j]));
}
}
return dp[n];
}
}