dp-分割整数问题

2020-02-15

343. 整数拆分 M(乘积最大化)

给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。

max函数可以使用initializer_list,用来求多个数的最值;

class Solution {
public:
    int integerBreak(int n) {
        vector<int> dp(n+1);
        dp[1] = dp[2] = 1;
        for(int i = 3; i <= n; i++){
            for(int j = 1; j <= i-1;j++){
                dp[i] = max({dp[i],dp[j]*dp[i-j],j*dp[i-j],dp[j]*(i-j),j*(i-j)});
            }
        }
        return dp[n];
    }
};

279. 完全平方数(按平方数来分割整数) M

给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。

有点像背包问题:复杂度O(N^1.5);

class Solution {
public:
    int numSquares(int n) {
        vector<int> dp(n+1,0x3f3f3f3f);
        dp[0] = 0;
        for(int i = 1; i*i <= n; i++)
            dp[i*i] = 1;
        for(int i = 1; i <= n; i++)
            for(int j = 0;j*j <=i; j++)
                dp[i] = min(dp[i],dp[j*j]+dp[i-j*j]);
        return dp[n];
    }
};

原文地址:https://www.cnblogs.com/Aliencxl/p/12311957.html

时间: 2024-11-07 21:33:26

dp-分割整数问题的相关文章

动态规划学习之LeetCode分割整数相关题目(第343、279、91题)

题目:给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化. 返回你可以获得的最大乘积. 示例: 输入: 10 输出: 36 解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36. 说明: 你可以假设 n 不小于 2 且不大于 58. 分析: 1.定义一个状态转移数组dp,dp[i]表示数字i拆分为至少两项之和后,拆分后的数字之间的最大乘积. 2.寻找关系式,那么如何确定dp[i]的最大值呢?首先我们要确定它有哪些取值的可能,对于拆分之和的数字的乘积,这个乘

动态规划(分割整数)---按平方数分割整数

最长递增子序列 ??已知一个序列 {S1, S2,...,Sn},取出若干数组成新的序列 {Si1, Si2,..., Sim},其中 i1.i2 ... im 保持递增,即新序列中各个数仍然保持原数列中的先后顺序,称新序列为原序列的一个 子序列 . ??如果在子序列中,当下标 ix > iy 时,Six > Siy,称子序列为原序列的一个 递增子序列 . ??定义一个数组 dp 存储最长递增子序列的长度,dp[n] 表示以 Sn 结尾的序列的最长递增子序列长度.对于一个递增子序列 {Si1,

杭电ACM分类

杭电ACM分类: 1001 整数求和 水题1002 C语言实验题——两个数比较 水题1003 1.2.3.4.5... 简单题1004 渊子赛马 排序+贪心的方法归并1005 Hero In Maze 广度搜索1006 Redraiment猜想 数论:容斥定理1007 童年生活二三事 递推题1008 University 简单hash1009 目标柏林 简单模拟题1010 Rails 模拟题(堆栈)1011 Box of Bricks 简单题1012 IMMEDIATE DECODABILITY

【转】对于杭电OJ题目的分类

[好像博客园不能直接转载,所以我复制过来了..] 1001 整数求和 水题1002 C语言实验题——两个数比较 水题1003 1.2.3.4.5... 简单题1004 渊子赛马 排序+贪心的方法归并1005 Hero In Maze 广度搜索1006 Redraiment猜想 数论:容斥定理1007 童年生活二三事 递推题1008 University 简单hash1009 目标柏林 简单模拟题1010 Rails 模拟题(堆栈)1011 Box of Bricks 简单题1012 IMMEDI

转载:hdu 题目分类 (侵删)

转载:from http://blog.csdn.net/qq_28236309/article/details/47818349 基础题:1000.1001.1004.1005.1008.1012.1013.1014.1017.1019.1021.1028.1029. 1032.1037.1040.1048.1056.1058.1061.1070.1076.1089.1090.1091.1092.1093. 1094.1095.1096.1097.1098.1106.1108.1157.116

java实战1——浮点数转人民币读法

为了学习安卓,现在开始从C++角度来学习Java,现在看到了<疯狂java讲义>的第四章,里面有个字符串转人民币的例子,书上没做完,于是把其补充完善.其中最难的部分就是根据零在不同位置,具有不同行为.按照中文读法,有些零要读出,有些零不需要读出.下面将按照两部分进行讲解,首先举一个例子来说明思路,其次给出Java的源代码供参考,并且进行测试.这个问题主要利用字符串数组来解决.我们假定要转换的浮点数整数部分不超过12位. (1) 思路 1.1 分割整数和小数部分 对于一个浮点数,先来看个简单点,

人民币金额大小写Js转换

/** * 数字转中文 * @param dValue * @returns */ function chineseNumber(dValue) { var maxDec = 2; // 验证输入金额数值或数值字符串: dValue = dValue.toString().replace(/,/g, ""); dValue = dValue.replace(/^0+/, ""); // 金额数值转字符.移除逗号.移除前导零 if (dValue == "&

[2016.6.11] NOIP模拟题

T1:贪吃蛇snake [题目描述] 哲哲迷上了一个非常有意思的游戏,这个游戏的内容就是通过上下左右来操作一条蛇的前进,比方说,你现在正在向上走,而你按了一下右,那么这条蛇就会转向右走,很有趣吧!这个游戏的名字叫做贪吃蛇.但是,这个看起来简单的游戏也挺需要操作的,如果你不小心撞到了墙,或是撞到自己的身体的话,你就输了. 可是,哲哲由于手指灵活度不够,经常撞墙而死,所以,他自己设计了一个没有墙的贪吃蛇地图,地图可以表示成若干个点,而你可以操作蛇头从某一个一个点到它相邻的点上.这样,游戏的难度降低了

js 实现类似php函数number_format的功能

今天同事在做一个功能的时候需要使用js来实现类似php函数number_format的功能,最后就有了下面的方法,可以实现了: /** * number_format * @param number 传进来的数, * @param bit 保留的小数位,默认保留两位小数, * @param sign 为整数位间隔符号,默认为空格 * @param gapnum 为整数位每几位间隔,默认为3位一隔 * @type arguments的作用:arguments[0] == number(之一) */