class Solution {
public int cuttingRope(int n) {
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++){
for(int j= i-1;j>=(i>>1);j--){
dp[i] =Math.max(dp[i],dp[j]*dp[i-j]);
}
}
return dp[n];
}
}
其他写法
//状态转移方程 dp[i] = dp[j] * dp[i - j]
class Solution {
public int cuttingRope(int n) {
//边界情况
if(n == 2) return 1;
if(n == 3) return 2;
//dp[i]表示绳子长度为i时的最大乘积
int[] dp = new int[n + 1];
//下面的初始化的意思是,长度为1时,参与计算乘积的最大值为1,
//长度为2时,参与计算乘积时最大值为2(即长度为2的绳子与其他部分的绳子相乘),长度为3的时候同理
dp[0] = 0;
dp[1] = 1;
dp[2] = 2;
dp[3] = 3;
//第一层遍历,是遍历绳子长度,自底向上计算
for(int i = 4; i <= n; ++i){
//第二层遍历,j代表剪掉的长度,因为左右剪掉计算都是一样的,因此 j <= i / 2可以减少一半的计算
for(int j = 2; j <= i / 2; ++j){
//状态转移方程,更新当前dp[i]的值,如果减下j长度来的乘积更大,则更新
//dp[j]减下来的左边的乘积的最大值,dp[i - j]减下来的右边的乘积的最大值
dp[i] = Math.max(dp[i], dp[j] * dp[i - j]);
}
}
//返回长度为n时的最大成绩即满足题意
return dp[n];
}
}
为什么这种这么快呢?有知道的小伙伴欢迎评论!
欢迎大家评论,如果本文对您有帮助,请点个赞,您的点赞对我很重要!这次一定!感谢!!!
转发请注明出处呦!感谢!!!