0
点赞
收藏
分享

微信扫一扫

剑指Offer——JZ67.剪绳子【DP | 贪心】


​​题目传送门​​

剑指Offer——JZ67.剪绳子【DP | 贪心】_算法

题解

动态规划:

  • 对于任意剑指Offer——JZ67.剪绳子【DP | 贪心】_动态规划_02,分解为剑指Offer——JZ67.剪绳子【DP | 贪心】_状态转移_03。对于任意剑指Offer——JZ67.剪绳子【DP | 贪心】_最优解_04
  • 剑指Offer——JZ67.剪绳子【DP | 贪心】_c++_05为长度为剑指Offer——JZ67.剪绳子【DP | 贪心】_c++_06
  • 那么状态转移方程:剑指Offer——JZ67.剪绳子【DP | 贪心】_算法_07

贪心:

  • 其实很好发现:
  • 剑指Offer——JZ67.剪绳子【DP | 贪心】_最优解_08
  • 剑指Offer——JZ67.剪绳子【DP | 贪心】_最优解_09
  • 剑指Offer——JZ67.剪绳子【DP | 贪心】_c++_10
  • 那么也就是说,最后一定会拆分的结果一定是小于等于剑指Offer——JZ67.剪绳子【DP | 贪心】_算法_11
  • 对于剑指Offer——JZ67.剪绳子【DP | 贪心】_算法_11,一定是拆分为剑指Offer——JZ67.剪绳子【DP | 贪心】_动态规划_13
  • 那么最后就是在剑指Offer——JZ67.剪绳子【DP | 贪心】_最优解_14剑指Offer——JZ67.剪绳子【DP | 贪心】_动态规划_15
  • 剑指Offer——JZ67.剪绳子【DP | 贪心】_最优解_16时,剑指Offer——JZ67.剪绳子【DP | 贪心】_最优解_17,那么就尽可能的按剑指Offer——JZ67.剪绳子【DP | 贪心】_动态规划_15
  • 最后剩下的如果是剑指Offer——JZ67.剪绳子【DP | 贪心】_最优解_14,就直接乘进去,如果是剑指Offer——JZ67.剪绳子【DP | 贪心】_算法_20,那就取出一个剑指Offer——JZ67.剪绳子【DP | 贪心】_动态规划_15组成剑指Offer——JZ67.剪绳子【DP | 贪心】_动态规划_13

AC-Code

DP:

class Solution {
public:
int cutRope(int number) {
if(number < 2) return 0;
if(number == 2) return 1;
if(number == 3) return 2;
int *dp = new int[number + 1];
memset(dp, 0, sizeof(dp));
dp[1] = 1; dp[2] = 2; dp[3] = 3;
for(int i = 4; i <= number; ++i)
for(int j = 1; j <= i / 2; ++j)
dp[i] = max(dp[i], dp[i - j] * dp[j]);
int ans = dp[number];
delete[] dp;
return ans;
}
};

贪心:

class Solution {
public:
int cutRope(int number) {
if(number < 2) return 0;
if(number == 2) return 1;
if(number == 3) return 2;
return number % 3 == 1 ? pow(3 , (number/3 - 1)) * 4 : pow(3, (number / 3)) * 2;
}
};


举报

相关推荐

0 条评论