leetcode 343. 整数拆分(动态规划)
创始人
2024-04-14 12:34:26
0

题目链接:343. 整数拆分

动态规划

(1) 确定 dpdpdp 数组下标含义:
dp[i]dp[i]dp[i]: 将 iii 拆分为至少两个正整数之后的最大乘积;
(2) 确定递推公式:
当 i≥2i \ge 2i≥2 时,
设 jjj 是 iii 拆分出来的第一个正整数,(1≤j≤i−11\leq j \leq i - 11≤j≤i−1),有以下两种方案:
i−ji - ji−j 不再拆分, 乘积为 j∗(i−j)j * (i - j)j∗(i−j);
i−ji - ji−j 继续拆分,乘积为 j∗dp[i−j]j * dp[i - j]j∗dp[i−j];
需要遍历所有 jjj 得到 dp[i]dp[i]dp[i], 因此
dp[i]=max(dp[i],max(j∗(i−j),j∗dp[i−j]));dp[i] = max(dp[i], max(j * (i - j), j * dp[i - j]));dp[i]=max(dp[i],max(j∗(i−j),j∗dp[i−j]));
(3) dpdpdp 数组初始化:
111 是最小的正整数, 不能拆分, 所以 dp[1]=0dp[1] = 0dp[1]=0; 其他下标均初始化为 000。
(4) 遍历顺序:
外循环 iii : 2−n2 - n2−n, 内循环 jjj : 1−(n−1)1 - (n - 1)1−(n−1), 从小到大。
(5) 举例推导 dpdpdp 数组:
n=6n = 6n=6 时:
请添加图片描述
dp[6]=9dp[6] = 9dp[6]=9 即为最终结果。

代码如下:

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

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
【PdgCntEditor】解... 一、问题背景 大部分的图书对应的PDF,目录中的页码并非PDF中直接索引的页码...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...
有效的括号 一、题目 给定一个只包括 '(',')','{','}'...