动态规划中级教程 343. Integer Break
2017-08-04 12:30
260 查看
Given a positive integer n, break it into the sum of at least two positive integers and maximize the product of those integers. Return the maximum product you can get.
For example, given n = 2, return 1 (2 = 1 + 1); given n = 10, return 36 (10 = 3 + 3 + 4).
Note: You may assume that n is not less than 2 and not larger than 58.
分析下题目
我们有两个手段
1.拆成两个数直接相乘
2.拆成n个数相乘(这里是我们动态规划的核心)我们把它优化成dp【i】*(i-j)
当拆成n个数的时候可以把其中一个数再拆成两个(造成重复子问题的关键)
dp【1】=1
dp【2】=1;
dp【3】=max(1*2,dp【2】*1)
dp【4】=max(2*2,dp【2】*2,dp【3】*1)
dp【5】=max(2*3,dp【2】*3,dp【3】*2,dp【4】*1)
dp【6】=max(3*3,dp【3】*3,。。。。。。。。。。。这里应该看出来了
可以写状态转移了
dp【i】=max{(i-j)*j, dp[i-j]*j }
For example, given n = 2, return 1 (2 = 1 + 1); given n = 10, return 36 (10 = 3 + 3 + 4).
Note: You may assume that n is not less than 2 and not larger than 58.
分析下题目
我们有两个手段
1.拆成两个数直接相乘
2.拆成n个数相乘(这里是我们动态规划的核心)我们把它优化成dp【i】*(i-j)
当拆成n个数的时候可以把其中一个数再拆成两个(造成重复子问题的关键)
dp【1】=1
dp【2】=1;
dp【3】=max(1*2,dp【2】*1)
dp【4】=max(2*2,dp【2】*2,dp【3】*1)
dp【5】=max(2*3,dp【2】*3,dp【3】*2,dp【4】*1)
dp【6】=max(3*3,dp【3】*3,。。。。。。。。。。。这里应该看出来了
可以写状态转移了
dp【i】=max{(i-j)*j, dp[i-j]*j }
class Solution { public: int integerBreak(int n) { int dp[n+1]; for(int i=0;i<=n;i++) { dp[i]=0; } dp[0]=0; dp[1]=1; dp[2]=1; for(int i=2;i<=n;i++) { for(int j=1;j<=i;j++) { dp[i]=max(dp[i],(i-j)*j); dp[i]=max(dp[i],dp[i-j]*j); } } return dp ; } };
相关文章推荐
- 动态规划中级教程300.Longest Increasing Subsequence
- 动态规划中级教程 279. Perfect Squares
- 动态规划中级教程(leetcode)152.Maximum Product Subarray
- 动态规划中级教程 322. Coin Change
- 动态规划中级教程 646. Maximum Length of Pair Chain
- 动态规划中级教程 377. Combination Sum IV
- python+selenium中级教程——系列
- Android[中级教程]第三章 数据存储之SQLite
- 非常特别的一个动态规划新手教程
- //九度OJ教程98 动态规划之LCS(最长公共子序列)
- NIO通讯框架之阿堂教程:Mina学习笔记-中级进阶篇(二)
- linux中级教程-权限机制
- HTML中级教程 自定义列表
- 微信小程序教学第二章:小程序中级实战教程之预备篇 - 项目结构设计 |基于最新版1.0开发者工具
- 【动态规划中级】AvoidRoads
- HTML标签属性【建站中级教程】
- Android中级教程之----Log图文详解(Log.v,Log.d,Log.i,Log.w,Log.e)!
- 微信小程序教学第四章第三节(含视频):小程序中级实战教程:详情-功能完善
- 全栈工程师之路-中级篇之小程序开发-入门教程完结报告