剑指offer - 14.剪绳子

这种文章网上很多,没什么营养,我只是自己记录一下。
(虽然现在不找工作了,但以后算法能力肯定需要加强,想着能不能每天坚持一道题,其实真做起来还有点难)
剑指offer以前都是边看答案边记下来,现在能不能靠自己写出来呢。
在这里插入图片描述
时间复杂度为O(n2),空间复杂度为O(n)
有一点要注意,m不是一个给定的参数。

思路是,(和书上不一样)
刚开始想,dp[i]是长度为i时切割后最大的乘积,dp[8] = max(dp[7]*1,dp[6]*2,dp[5]*3,…,dp[2]*6,dp[1]*7),对于长度为8,我最后一刀切成1,2,3,…6,7,剩下部分由你之前算得的最优值提供。
后来调试发现,这样是不对的,比如dp[2]的值为1(1 *1),因为必须要有切割,但在求dp[8]时要用到dp[2]*6,却可以看作左边长度为2不进行切割,所以还要加上max(dp[2],2)*6,这样就对了。具体代码如下。

代码:

#include <iostream>
#include <vector>  
#include<algorithm>
using namespace std;

int maxCutProduct(int n) {
	if (n < 2) return 0;
	int* dp = new int[n+1];
	int maxres;
	dp[1] = 1;
	for (int i = 1; i <= n; i++) {
		maxres = 1;
		for (int j = 1; j < i; j++) {
			maxres = max(maxres, max(dp[j],j) * (i - j)); //看上面
		}
		dp[i] = maxres;
	}
	int res = dp[n];
	delete dp;
	return res;
}

int main()
{
	int n = 8;
	int res = maxCutProduct(n);
	cout << res << endl; //18
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值