当前位置: 首页 > news >正文

泉州网站公司搜狗网页版

泉州网站公司,搜狗网页版,java网站开发论文,阜阳建设工程质量监督网站343. 整数拆分 文章目录 [343. 整数拆分](https://leetcode.cn/problems/integer-break/)一、题目二、题解方法一:动态规划方法改良 一、题目 给定一个正整数 n ,将其拆分为 k 个 正整数 的和( k > 2 ),并使这些整…

343. 整数拆分

文章目录

    • [343. 整数拆分](https://leetcode.cn/problems/integer-break/)
      • 一、题目
      • 二、题解
        • 方法一:动态规划
        • 方法改良


一、题目

给定一个正整数 n ,将其拆分为 k正整数 的和( k >= 2 ),并使这些整数的乘积最大化。

返回 你可以获得的最大乘积

示例 1:

输入: n = 2
输出: 1
解释: 2 = 1 + 1, 1 × 1 = 1。

示例 2:

输入: n = 10
输出: 36
解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36。

提示:

  • 2 <= n <= 58

二、题解

方法一:动态规划

好的,让我们按照动态规划的五个步骤来解决这道题目:

步骤一:确认dp数组以及下标的含义

  • dp[i] 表示正整数 i 拆分后可以获得的最大乘积。

步骤二:确认递推公式

  • 对于正整数 i,我们可以把它拆分成两个正整数 j 和 i-j,其中 1 <= j < i。
  • 那么,对于拆分的两个正整数 j 和 i-j,可以计算它们的乘积 max(j * (i-j))。
  • 但我们还需要考虑 j 和 i-j 是否继续拆分,因此递推公式为 dp[i] = max(max(j * (i-j), j * dp[i-j]), max(dp[j] * (i-j), dp[j] * dp[i-j]))。

步骤三:数组初始化

  • dp[1] 和 dp[2] 的值分别为 0 和 1,因为它们都不能再拆分。

步骤四:确定遍历顺序

  • 我们从小到大遍历正整数 i,从 3 开始遍历到 n,依次计算 dp[i] 的值。

步骤五:举例推导dp数组
让我们通过一个示例来推导 dp 数组。假设输入 n = 6:

进行推导:

  1. 初始化 dp 数组:
dp = [0, 1]
  1. 计算 dp[3]:
dp[3] = max(max(1*(3-1), 1*dp[3-1]), max(dp[1]*(3-1), dp[1]*dp[3-1])) = max(max(1*2, 1*1), max(0*2, 0*1)) = 2
  1. 计算 dp[4]:
dp[4] = 4
  1. 计算 dp[5]:
dp[5] = 6
  1. 计算 dp[6]:
dp[6] = 9

最终返回 dp[n],即 dp[6] = 9,表示将正整数 6 拆分后可以获得的最大乘积为 9。

class Solution {
public:int integerBreak(int n) {vector<int> dp(n+1);dp[1] = 0;dp[2] = 1;for(int i = 3; i <= n; i++){int maxm = 1;//i/2是一个改善措施,因为当j>i/2后所有的情况之前都已经产生过了for(int j = 1; j <= i/2; j++){int k = i-j;int temp = max(max(j*k,dp[j]*k),max(dp[k]*j,dp[j]*dp[k]));if(maxm < temp) maxm = temp;}dp[i] = maxm;}return dp[n];}
};

方法改良

在递推公式的计算部分,我们可以将递推公式简化为 dp[i] = max(j * k, j * dp[k]),并且不再计算 dp[j] * dp[k] 部分。

改良的原因:

  • 在原始的递推公式中,我们考虑了 j 和 k 是否继续拆分,计算了 dp[j] * dp[k] 部分,但实际上,这部分是在之前的状态中已经计算过的,而且不会再参与当前状态的计算。
  • 因此,我们可以直接在递推公式中计算 j * dp[k] 部分,而不再重复计算之前已经得到的 dp[j]。

改良后的代码如下:

cppCopy codeclass Solution {
public:int integerBreak(int n) {vector<int> dp(n + 1);dp[2] = 1;for (int i = 3; i <= n; i++) {int maxm = 1;for (int j = 1; j <= i / 2; j++) {int k = i - j;int temp = max(j * k, j * dp[k]);if (maxm < temp) maxm = temp;}dp[i] = maxm;}return dp[n];}
};
http://www.ds6.com.cn/news/124325.html

相关文章:

  • 音乐网站页面设计全球网站流量查询
  • 衡阳退休职工做面膜网站怎么可以让百度快速收录视频
  • 西宁做网站君博解决网站如何被搜索引擎收录
  • 上海招聘用的最多的网站网络优化工程师骗局
  • 宽带费用多少钱一年广东搜索引擎优化
  • 发布php做的网站整站优化系统厂家
  • 政府网站建设人员的组织怎么在百度做免费推广
  • 计算机应用技术专业网站seo优化网站
  • 厦门seo网站关键词优推广长沙疫情最新消息今天封城了
  • 做数学题赚钱的网站阿里云盘资源搜索引擎
  • 做个网站多少钱一年培训机构还能开吗
  • 点胶喷嘴技术支持东莞网站建设搜索引擎优化实训心得
  • 一个空间怎么做两个网站 跳转seo关键词优化软件怎么样
  • 山西做网站流程步骤百度老旧版本大全
  • 网站数据库修改密码要怎么做可以免费发外链的论坛
  • 公司商城网站建设阿里妈妈推广网站
  • 弥勒网站开发打开网址资料网站
  • 装饰公司网站建设深圳seo优化方案
  • 做网站建设需要什么工具国外网站加速
  • 省政府网站群建设研究关键词百度云
  • 网站布局优化怎么做口碑营销怎么做
  • 做刷票的网站关键词首页排名优化公司推荐
  • 网站 猜你喜欢 怎么做福建百度推广开户
  • 付钱做编程题目的网站如何在百度上发布自己的广告
  • wordpress 404宝塔杭州优化关键词
  • 浙江华企做的网站效果如何网络营销seo优化
  • 开发网站网络公司排行链接检测工具
  • 怎样增加网站收录量电商运营怎么自学
  • 做网站外包游戏代理加盟
  • 大气红色网站seo网站建设公司