动态规划之割绳子

题目:给你一根长度为n的绳子,请把绳子剪成m段 (m和n都是整数,n>1并且m>1)每段绳子的长度记为k[0],k[1],…,k[m]. 请问k[0]k[1]…*k[m]可能的最大乘积是多少?例如,当绳子的长度为8时,我们把它剪成长度分别为2,3,3的三段,此时得到的最大乘积是18.

思路:采用自底向上的动态规划方法。设f(n)代表长度为n的绳子剪成若干段的最大乘积,如果第一刀下去,第一段长度是i,那么剩下的就需要剪n-i,那么f(n)=max{f(i)f(n-i)}。而f(n)的最优解对应着f(i)和f(n-i)的最优解,假如f(i)不是最优解,那么其最优解和f(n-i)乘积肯定大于f(n)的最优解,和f(n)达到最优解矛盾,所以f(n)的最优解对应着f(i)和f(n-i)的最优解。首先,剪绳子是最优解问题,其次,大问题包含小问题,并且大问题的最优解包含着小问题的最优解,所以可以使用动态规划求解问题,并且从小到大求解,把小问题的最优解记录在数组中,求大问题最优解时就可以直接获取,避免重复计算。
    n<2时,由于每次至少减一次,所以返回0。n=2时,只能剪成两个1,那么返回1。n=3时,可以剪成3个1,或者1和2,那么最大乘积是2。当n>3时,就可以使用公式进行求解。
    f(4)=max{f(1)f(3), f(2)f(2)}
    f(5)=max{f(1)f(4), f(2)f(3)}
    ...
    f(n)=max{f(1)f(n-1), f(2)f(n-2), f(3)f(n-3), ..., f(i)(fn-i), ...}
<

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
s': // 地球向下移动 earth_pos[1] -= 0.1; break; } } // 定时器事件处理函数 void timer(int value) { update(); glutTimerFunc(20, timer, 0); } 绳子是一款非常流行的益智游戏,它的核心玩法是通过切绳子来// 主函数 int main(int argc, char *argv[]) { glutInit(&argc, argv); glutInitDisplayMode(GLUT让物体掉落到指定位置,同时需要收集星星来获取更高的分数。在 Cocos Creator 中_DOUBLE | GLUT_RGB | GLUT_DEPTH); glutInitWindowSize(800, 600); glutCreateWindow("Earth and Moon"); glut实现绳子的过程大致可以分为以下几个步骤: 1. 创建游戏场景和物体DisplayFunc(display); glutMouseFunc(mouse); glutKeyboardFunc(keyboard); glutTimerFunc(20, timer, 0); :使用 Cocos Creator 的场景编辑器创建游戏场景,然后添加需要切绳子和物体等 init(); glutMainLoop(); return 0; } ``` 这个程序使用了OpenGL库,实现了一个简游戏元素。 2. 实现物体的掉落:使用物理引擎(如 Cocos Creator 自带的 Box单的地月绕太阳公转的效果。其中地球和月球是用图素构造法构成的2D 物理引擎)来实现物体的掉落,同时设置物体的刚体属性、碰撞体属性三维球体,太阳是一个实心球体。程序支持鼠标左键点击开始运动,支持键等。 3. 实现绳子的切:在游戏场景中添加触摸事件监听器,当玩家触盘控制地球改变轨道。此外,地球和月球还添加了phong光照效果,增摸到绳子时,计算出触摸点与绳子的交点,并将绳子分成两段。可以使用强了真实感。 程序中使用了三个数组分别存储地球和月球的位置和速度,每 Cocos Creator 自带的 Graphics 组件来绘制切后的绳子。 4. 实现星星的收集:在次更新时根据万有引力定律计算它们的位置和速度。鼠标事件处理函数中实现游戏场景中添加触发器,当物体与星星重叠时,触发收集星星的事件,并了视角的变换,键盘事件处理函数中实现了地球的移动。定时器事件处理函数中更新分数。 5. 实现游戏结束逻辑:当物体掉落到指定位置或者掉落到屏不断更新地球和月球的位置和速度,并进行重绘。 希望这个示范程序对你有所帮助。如果还有疑问,可以继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值