leetcode 343. 整数拆分:动态规划(c++)

  • leetcode 343. 整数拆分

  • 分析

    1. 状态表示:

      · dp[i] 表示整数 i 拆分乘积的最大值。

    2. 转移方程:

      · 对于每个数字 i 都进行一遍循环,计算 (i - j) * j,(j <= i - 1),并求其与 dp[i],dp[i - j] * j 的最大值,即:dp[i] = max(dp[i],(i - j) * j,dp[i - j] * j)

      · 与 dp[i - j] * j 比较是因为 i - j 可能小于 i - j 拆分的乘积。

    3. 边界:

      · 输入的整数 n 大于等于 2,考虑到会拆分成类似 (i - 1) * 1 等类型,故dp[1] = 1

  • 实现

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

    1. 确定状态转移的方式:想求dp[i],应先求dp[i - j],(j <= i - 1)
    2. 确定状态转移方程:明确拆分时的可能乘积,本题有两个 (i - j) * j 和 j * dp[i - j]
    3. 确定边界
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 回溯算法 回溯法:也称为试探法,它并不考虑问题规模的大小,而是从问题的最明显的最小规模开始逐步求解出可能的答案,并...
    fredal阅读 13,738评论 0 89
  • 树形动态规划,顾名思义就是树+DP,先分别回顾一下基本内容吧:动态规划:问题可以分解成若干相互联系的阶段,在每一个...
    Mr_chong阅读 1,509评论 0 2
  • 计算机二级C语言上机题库(南开版) 1.m个人的成绩存放在score数组中,请编写函数fun,它的功能是:将低于平...
    MrSunbeam阅读 6,464评论 1 42
  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 3,410评论 0 2
  • 动态规划 动态规划是一种高性能的牛逼算法,由美国的R.Bellman提出,它是动态就是体现在此算法是基于一个递推公...
    董泽平阅读 1,196评论 0 12