dp的含义表示:从前i个数中挑选,满足和为j的最大乘积为多少。由于是乘积所以dp初始均为1。i为2开始是因为从1开始挑选,j为2开始应为有效数字是从2开始。 进一步空间优化,应为dp[i][j]只与其相邻的状态有关。

// 思路初探:将本题转化成完全背包问题。
// 完全背包问题不用塞满背包,而本题“必须塞满背包”,如何转化
// 如果塞不满,那么塞不满的部分就取数字1,由于 n x 1 = n,所以不影响最终结果
// 集合:dp[i][j]表示表示考虑数字1~i情况下,数字和≤j情况下的乘积
// 属性:乘积最大值
// 状态转移方程:dp[i][j] = max(dp[i -1][j], dp[i][j - i] *i,dp[i][j-2i]*i*i)
// 怎么代码简化上述状态转移方程参考acwing的完全背包问题
class Solution {
public:
int integerBreak(int n) {
if(n == 2){
return 1;
}
if(n == 3){
return 2;
}
vector<vector<int>> dp(n+10,vector<int>(n+10,1));
for(int i = 2;i<=n;i++){
for(int j = 2;j <= n;j++){
dp[i][j] = dp[i-1][j];
if(j >= i){
dp[i][j] = max(dp[i][j],dp[i][j-i] * i);
// 这一行很多细节的。
}
}
}
return dp[n][n];
}
};

本代码有很多细节:

  1. 为何要将全部初始状态赋予1?可能会考虑到初始化可以改成如下也行:
        vector<vector<int>> dp(n+10,vector<int>(n+10,0));
for(int j = 2;j<=n;j++){
dp[1][j] = 1;
}

其实是不行的,因为状态更新的时候有:

                if(j >= i){
dp[i][j] = max(dp[i][j],dp[i][j-i] * i);
// 这一行很多细节的。
}

第一次j==i的时候dp[i][j-i]=dp[i][0],因此dp[i][0]的初始值也应该赋1。

2. 为何要把2和3特殊处理提前返回?以2举例,2的正确答案应该是1,如果不提前返回,那么当进入到dp[i][j] = max(dp[i][j],dp[i][j-i] * i);会出现总和为2,那么可以选择一个2,答案就为2的情况。又因为在其他的选择方式中不存在结果比2大的情况,因此答案错误的输出2。总结来说:对于符合下列条件的数k需要提前返回:\(合法的结果 < k\)。满足此条件的数就是2和3。

为何只有2和3满足不赘述了,有需要再补充。

LeetCode刷题:343. 整数拆分的完全背包写法解析的更多相关文章

  1. leetcode刷题七<整数反转>

    给出一个 位的有符号整数,你需要将这个整数中每位上的数字进行反转. 示例 : 输入: 输出: 示例 : 输入: - 输出: - 示例 : 输入: 输出: 假设我们的环境只能存储得下 32 位的有符号整 ...

  2. Leetcode刷题——007.整数反转

    上代码: #include <cmath> class Solution { public: int reverse(int x) { ; long long tx=llabs(x); ) ...

  3. LeetCode 343. 整数拆分(Integer Break) 25

    343. 整数拆分 343. Integer Break 题目描述 给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化. 返回你可以获得的最大乘积. 每日一算法2019/5/2 ...

  4. Java实现 LeetCode 343 整数拆分(动态规划入门经典)

    343. 整数拆分 给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化. 返回你可以获得的最大乘积. 示例 1: 输入: 2 输出: 1 解释: 2 = 1 + 1, 1 × ...

  5. C#LeetCode刷题-动态规划

    动态规划篇 # 题名 刷题 通过率 难度 5 最长回文子串   22.4% 中等 10 正则表达式匹配   18.8% 困难 32 最长有效括号   23.3% 困难 44 通配符匹配   17.7% ...

  6. C#LeetCode刷题-数学

    数学篇 # 题名 刷题 通过率 难度 2 两数相加   29.0% 中等 7 反转整数 C#LeetCode刷题之#7-反转整数(Reverse Integer) 28.6% 简单 8 字符串转整数 ...

  7. leetcode刷题目录

    leetcode刷题目录 1. 两数之和 2. 两数相加 3. 无重复字符的最长子串 4. 寻找两个有序数组的中位数 5. 最长回文子串 6. Z 字形变换 7. 整数反转 8. 字符串转换整数 (a ...

  8. leetcode刷题-- 5. 动态规划

    动态规划思路 参考 状态转移方程: 明确「状态」-> 定义dp数组/函数的含义 -> 明确「选择」-> 明确 base case 试题 53最大子序和 题目描述 53 给定一个整数数 ...

  9. C#LeetCode刷题-字符串

    字符串篇 # 题名 刷题 通过率 难度 3 无重复字符的最长子串   24.6% 中等 5 最长回文子串   22.4% 中等 6 Z字形变换   35.8% 中等 8 字符串转整数 (atoi)   ...

  10. LeetCode刷题指南(字符串)

    作者:CYC2018 文章链接:https://github.com/CyC2018/CS-Notes/blob/master/docs/notes/Leetcode+%E9%A2%98%E8%A7% ...

随机推荐

  1. 参与 2024 第四季度官方 Flutter 开发者调查

    Flutter 3.24 和 Dart 3.5 稳定版发布 已有三月之久,今年最后一次开发者调查也如约而至! 自 Flutter 3.24 正式发布以来,团队通过一系列补丁更新不断优化平台稳定性和开发 ...

  2. 网站统计代码v1.0

    var m = {}; var p ={}; var gifUrl = 'http://hm.iwgame.test/v.gif'; (function() { //参数组合类 m = { ck : ...

  3. vue遇到Conflicting order. Following module has been added:(加载顺序冲突)

    其中article.vue和topGroup.vue这两个文件在模块unitTest和wrongBook上出现加载冲突 其中一个文件先加载topGroup.vue文件其中一个文件先加载article. ...

  4. 浅谈Java的Mina框架传递对象

    本篇文章主要讲解Java的Mina框架传递对象是什么,并附于代码和图片方便大家理解. AD:2013大数据全球技术峰会课程PPT下载 接触java的Mina框架已经有很多时间了,在网上也读过了很多的相 ...

  5. 在vue中使用XLSX导出表格

    安装依赖 npm install file-saver xlsx -S 然后在需要的页面中引入依赖包 import FileSaver from 'file-saver'; import XLSX f ...

  6. PHP编译安装之常见问题

    正式服的PHP环境,一般都会进行编译安装,汇总一下经常遇到的一些问题 1.Call to undefined function crmeb\utils\imagecreate 解决:需要安装gd库 1 ...

  7. python之在线书籍

    人生苦短,我用python, 这里罗列一些可以查看python电子书的相关链接,平时没事多看看,一定会大有裨益!!! python3-cookbook[https://python3-cookbook ...

  8. Educational Codeforces Round 65 (Rated for Div

    D - Bicolored RBS 给定一个括号序列,现在你必须对每一个括号涂成蓝色或红色,要求使得涂完后的红色括号和蓝色括号序列都必须是合法的括号序列,设红色括号形成的的括号序列的深度为\(dep_ ...

  9. Codeforces Round #826 (Div

    Codeforces Round #826 (Div. 3) Minimize the Thickness 给定数组a,要求将数组a分成若干个子序列,并且使得每个子序列中的元素和都相等,设这些子序列中 ...

  10. NOIP 备赛:CF 2E 板刷

    从 \(2024.11.05\) 之前的比赛排着刷. CF2028 E 这道题主要考察的是手玩能力和转移技巧. 给定一棵树,根为 \(1\).爱丽丝的起点位于某个顶点 \(v\) .她想走出洞口,但不 ...