动态规划(二)

作者: 茶还是咖啡 | 来源:发表于2020-10-10 07:46 被阅读0次

给定一个正整数n,可以将其分割成多个数字的和,若要让这些数字的乘机最大,求分割的方法,(至少分成两个数)。返回这个最大的乘机。
如:
n=2,则返回1(2=1+1)
n=10,则返回36(10=3+3+4)

暴力解法

回溯遍历将一个数做分割,时间复杂度O(2^n)

  1. 此处以分割4为例,如下图:
  1. 对应分割n,如下图:

对应的代码如下:

    int breakInteger(int n) {
        if (n == 1) {
            return 1;
        }
        int res = -1;
        for (int i = 1; i < n - 1; i++) {
            // i*(n-i)加入比较的原因
            // 因为函数breakInteger一定要将一个数字分割成两部分,
            // 所以,如果我们只将n分成两部分不想在往下分割了,那就是 i*(n-i)
            res = max(res, i * (n - i), i * breakInteger(n - i));
        }
        return res;
    }

    int max(int a, int b, int c) {
        return Integer.max(a, Integer.max(b, c));
    }

上面分割n的图中,我们可以看到该题也会出现”重叠子问题“的情况,所以可以进一步进行”记忆化搜索“,将算好的结果记录下来,避免重复运算。

    int breakInteger(int n) {
        int[] memo = new int[n + 1];
        Arrays.fill(memo, -1);
        return breakIntegerCore(n, memo);
    }

    int breakIntegerCore(int n, int[] memo) {
        if (n == 1) {
            return 1;
        }
        if (memo[n] != -1) {
            return memo[n];
        }
        int res = -1;
        for (int i = 1; i < n - 1; i++) {
            // i*(n-i)加入比较的原因
            // 因为函数breakInteger一定要将一个数字分割成两部分,
            // 所以,如果我们只将n分成两部分不想在往下分割了,那就是 i*(n-i)
            res = max(res, i * (n - i), i * breakIntegerCore(n - i, memo));
        }
        memo[n] = res;
        return res;
    }

    int max(int a, int b, int c) {
        return Integer.max(a, Integer.max(b, c));
    }

动态规划

自底向上解决

    int integerBreak(int n) {
        // memo[i]用于存储将数字i进行分割(至少分割成两部分)后,最大的乘积
        int[] memo = new int[n + 1];
        Arrays.fill(memo, -1);

        memo[1] = 1;

        for (int i = 2; i <= n; i++) {
            // 计算memo[i]
            for (int j = 1; j < i - 1; j++) {
                // i*(i-j)
                memo[i] = max(memo[i], j * (i - j), j * memo[i - j]);
            }
        }
        return memo[n];
    }

Perfect Squares

给定一个正整数,寻找最少的完全平方数,使他们的和为n
eg:
12=4+4+4
13=4+9

Decode Ways

一个字符串,包含A-Z的字母,每个字符可以和1-26的数字对应,如:A-1,B-2...Z-26。给出一个数字字符串,问,我们有多少种方法可以解析这个数字字符串?
eg:
AB 可以解析成(1,2)或者12,最终返回2

Unique path


有一个机器人,从一个m*n的矩阵的左上角出发,要达到这个矩阵的有下角,机器人每次只能向右或者向下移动,问一共有多少种不同的路径。

相关文章

  • 走楼梯——二维带权值走楼梯(四)

    LeetCode_64_MinimumPathSum 题目分析: 解法一:循环-动态规划 解法二:循环-动态规划-...

  • 初识动态规划

    0-1 背包问题 备忘录 动态规划-二维数组 动态规划-一维数组 0-1 背包问题升级版 回溯算法 动态规划-二维...

  • 走楼梯——二维有障碍走楼梯(五)

    LeetCode_63_UniquePathsII 题目分析: 解法一:循环-动态规划 解法二:循环-动态规划-递...

  • 走楼梯——二维带权值带特殊条件加倒着走楼梯(六)

    LeetCode_174_DungeonGame 题目分析: 解法一:循环-动态规划 解法二:循环-动态规划-内存...

  • 走楼梯——二维走楼梯(三)

    LeetCode_62_UniquePaths 题目分析: 解法一:循环-动态规划 解法二:循环-动态规划-内存优...

  • 算法学习收藏

    动态规划问题 动态规划(最优子结构和重叠子问题的比较) 动态规划解决01背包问题 01背包问题 最优二叉查找树 《...

  • 动态规划(二)

    给定一个正整数n,可以将其分割成多个数字的和,若要让这些数字的乘机最大,求分割的方法,(至少分成两个数)。返回这个...

  • 动态规划(二)

    上一篇文章对于动态规划做了一个简单的介绍,这一次,我想来讲讲动态规划中,不同路径这一类型的题目。这种类型的题目这L...

  • 动态规划(二)

    状态压缩DP POJ 2441: Arrange the Bulls表示前i头cow,目前畜栏使用情况为j的方案数...

  • 二 动态规划

    动态规划:把多阶段过程转化为一系列单阶段问题,利用各阶段之间的关系,逐个求解 动态规划算法通常基于一个递推公式及一...

网友评论

    本文标题:动态规划(二)

    本文链接:https://www.haomeiwen.com/subject/edugyktx.html