剑指 Offer 14- I. 剪绳子

我服了。动态规划杀我。

可以说一说解决动态规划的思路(只做了两三道就总结了emmm)

1.识别动态规划问题

--重叠子问题:大问题可以分为一个个子问题。和分治策略分割的子问题不同(分治问题的子问题是相互独立的),动态规划的子问题是相互重叠的。对于剪绳子这道题,绳子长度从2到n都分别是一个子问题,重叠性显然看出来。如果用递归策略,自顶向下求解,很多子问题会被重复计算,如求长度是10的绳子,一定会求长度为8(7,6都会求)时的最优解。(这个可能难理解,但是现在不是重点,讲清楚可能要借鉴别人的博客,关于递归问题和动态规划的异同)

--最优子结构:每个子问题都有最优解。且总问题的每个子问题一定是最优的(这句话和本题的联系需要再揣摩)。

--无后效性:子问题的解一旦确定,就不再改变,不受在这之后、包含它的更大的问题的求解决策影响。

2.写出状态,列出状态方程。

这一步是非常重要的,是动态规划思路的核心。也可以说这是一个递推方程。

3.确定边界条件(初始条件)

有了递推方程和初始条件,可以得到所有最优解。

列出状态转移方程的技巧是,首先考虑子问题,思考如何解决该子问题的最后一步,就可以列出来。

长度为i的绳子,设dp[i]是将绳子剪成m段(m是多少不用关心)的最大长度(这个dp数组,即状态,往往是题目要求的问题),这个绳子最后一步是剪出一段长度为j的短绳(j应该从2开始),剩下i-j的绳子是剪还是不剪?

如果剪,dp[i]=dp[i-j]*j

如果不剪,dp[i]=j*(i-j)

长度为i的绳子,剪出j后的dp[i]=max(j*(i-j),dp[i-j]*j)。

每个j都有一个dp[i],对于每个i应有dp[i]=max(dp[i],max(j*(i-j),dp[i-j]*j))---意思是对每个dp[i],取最大值存进来。

这一点和0-1背包问题很像,但状态方程有点区别,关键在于0-1背包问题的最后一步是简单的放与不放,这个剪绳子的最后一步是j从2到i-1(不能剪出和i相等或者比i长的长度吧)的每个数都有可能,所以每个j的dp[i]也要比较。

只要状态转移方程写对了,还有初始条件dp[2]=1,就能解决问题,好神奇,根本不关心m段究竟是多少段,如同0-1背包问题里不关心里面的物体分别是什么且有几件一样。神奇。

1 class Solution { 2     public int cuttingRope(int n) { 3      int[] dp =new int[n 1];//在方法里会默认初始化吗?--看来是会的,这样提交没报错 4       5      dp[2]=1; 6      for(int i=3;i<n 1;i  ){ 7          for(int j=2;j<i;j  ){ 8              dp[i]=Math.max(dp[i],Math.max(dp[i-j]*j,j*(i-j))); 9          }10      }11      return dp[n];12     }13     14 }
(0)

相关推荐

  • (1条消息) 动态规划入门看这篇就够了,万字长文!

    今天是小浩算法 "365刷题计划" 动态规划 - 整合篇.大家应该期待已久了吧!奥利给! 01 PART 动态规划是啥 我们把要解决的一个大问题转换成若干个规模较小的同类型问题,当 ...

  • (1条消息) 动态规划就此一篇 全网最详细, 逐步理解, 万字总结

    文章目录 动态规划 - 超详细系列 首先,先大致列下这篇文章会讲到什么 1.相较于暴力解法,动态规划带给我们的是什么?为什么会有重叠子问题以及怎么去避免的? 2.用不同难度的动态规划问题举例说明, 最 ...

  • 狂刷100道题,我是怎么向5岁侄女解释动态规划的? | 掘金年度征文

    我膨胀了,相信看了这个标题的同学,肯定忍不住破口大骂,什么瓜皮哦,dynamic programming这么简单吗,在我的印象里,尼玛动态规划是最难的. 背景 侄女5岁现在开始学习加减法了,每次做数学 ...

  • 动态规划之武林秘籍

    听到 动态规划 这个响亮的大名你可能已经望而却步,那是因为这个响亮的名字真的真的很具有迷惑性,不像递归.回溯和贪心等等算法一样,其文即其意,而动态规划则不同,很容易望文生义,真可谓害人不浅,今天我就带 ...

  • 动态规划(DP)

    本课程是从少年编程网转载的课程,目标是向中学生详细介绍计算机比赛涉及的编程语言,数据结构和算法.编程学习最好使用计算机,请登陆 www.3dian14.org (免费注册,免费学习). 本月7月13日 ...

  • 动态规划详解

    这篇文章是我们号半年前一篇 200 多赞赏的成名之作 动态规划详解 的进阶版.由于账号迁移的原因,旧文无法被搜索到,所以我润色了本文,并添加了更多干货内容,希望本文成为解决动态规划的一部「指导方针」. ...

  • 动态规划之状态转移方程-NOIP提高组历年高频考点(4)

    通过分析NOIP2011-2018年提高组的试题我们就会发现,考察最多的考点前三名就是模拟,动态规划和贪心算法.今天我们来介绍一下动态规划常用的状态转移方程. 动态规划之状态压缩DP-NOIP提高组历 ...

  • (1条消息) 漫画:动态规划系列 第三讲

    在上一篇中,我们了解了什么是DP(动态规划),并且通过DP中的经典问题 "最大子序和",学习了状态转移方程应该如何定义.在本节中,我们将沿用之前的分析方法,通过一道例题,进一步巩固 ...

  • 剑指offer之剪绳子问题

    剑指offer之剪绳子问题

  • 【剑指Offer】数值的整数次方

    题目描述 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 保证base和exponent不同时为0 解法1 最直接的思路,计算base的 ...

  • 【剑指Offer】链表中倒数第k个结点

    题目描述 输入一个链表,输出该链表中倒数第k个结点. 解法 基本思路是使用两个辅助指针p, q,让p先走k - 1步后,p, q两个指针再一起走 这样当p指针走到链表的末尾时,q指针刚好走到的就是倒数 ...

  • 【剑指Offer】反转链表

    题目描述 输入一个链表,反转链表后,输出新链表的表头. 解法1 可以使用三个辅助指针pHead, last,next pHead记录当前节点,last记录上一个节点,next记录下一个节点 首先使用n ...

  • 剑指offer

    03 数组中重复的数字 public int findRepeatNumber(int[] nums){ //排序后的数组,重复元素必然相邻 Arrays.sort(nums); //结果集 int ...

  • 剑指 Offer 30. 包含min函数的栈

    定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min.push 及 pop 的时间复杂度都是 O(1). 示例:MinStack minStack = ne ...

  • 剑指offer笔记面试题2----实现Singleton模式

    题目:设计一个类,我们只能生成该类的一个实例. 解法一:单线程解法 //缺点:多线程情况下,每个线程可能创建出不同的的Singleton实例 #include <iostream> usi ...

  • 每日一题 剑指offer(包含min函数的栈)

    编程是很多偏计算机.人工智能领域必须掌握的一项技能,此编程能力在学习和工作中起着重要的作用.因此小白决定开辟一个新的板块"每日一题",通过每天一道编程题目来强化和锻炼自己的编程能力 ...

  • 每日一题 剑指offer(从上往下打印二叉树)

    编程是很多偏计算机.人工智能领域必须掌握的一项技能,此编程能力在学习和工作中起着重要的作用.因此小白决定开辟一个新的板块"每日一题",通过每天一道编程题目来强化和锻炼自己的编程能力 ...