动态规划 | 乘积最大

这篇具有很好参考价值的文章主要介绍了动态规划 | 乘积最大。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

题目描述

原题链接

今年是国际数学联盟确定的“2000——世界数学年”,又恰逢我国著名数学家华罗庚先生诞辰 90 周年。在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学智力竞赛的活动,你的一个好朋友 XZ 也有幸得以参加。活动中,主持人给所有参加活动的选手出了这样一道题目:

设有一个长度为 N N N 的数字串,要求选手使用 K K K 个乘号将它分成 K + 1 K+1 K+1 个部分,找出一种分法,使得这 K + 1 K+1 K+1 个部分的乘积能够为最大。

同时,为了帮助选手能够正确理解题意,主持人还举了如下的一个例子:

有一个数字串: 312 312 312,当 N = 3 , K = 1 N=3,K=1 N=3,K=1 时会有以下两种分法:

  1. 3 × 12 = 36 3 \times 12=36 3×12=36
  2. 31 × 2 = 62 31 \times 2=62 31×2=62

这时,符合题目要求的结果是: 31 × 2 = 62 31 \times 2 = 62 31×2=62

现在,请你帮助你的好朋友 XZ 设计一个程序,求得正确的答案。

提示

数据范围与约定

对于 60 % 60\% 60% 的测试数据满足 6 ≤ N ≤ 20 6≤N≤20 6N20
对于所有测试数据, 6 ≤ N ≤ 40 , 1 ≤ K ≤ 6 6≤N≤40,1≤K≤6 6N40,1K6

问题分析

状态定义dp[i][k]表示对于数字串s[0...i],添加 k 个乘号,对应的乘积最大值。

有了上述的状态定义,我们可以发现,对于任意的dp[i][k]都可以由两部分组成,一部分是前 p 个数字串中包含 k - 1 个乘号,另一部分是剩下部分的数字串不包含乘号。然后遍历所有可能的分割点 p,找两部分乘积的最大值。

动态规划 | 乘积最大,手撕算法,动态规划,算法

状态计算

  • dp[i][k] = max(dp[i][k], dp[p][k-1] * s[p + 1 ... n - 1])

边界情况

  • dp[i][0] = s[0...i],即若不添加乘号,则数字串s[0...i]的乘积最大值为本身。

程序代码

由于对于所有测试数据, 6 ≤ N ≤ 40 , 1 ≤ K ≤ 6 6≤N≤40,1≤K≤6 6N40,1K6。若用 C++ 实现,涉及大数乘法的问题,需要用到高精度的策略进行求解。这里为了重点突出算法思想,采用 Python 进行实现,避开高精度的问题。

n, k= map(int, input().split())
s = input()
dp = [[0 for i in range(k + 1)] for j in range(n)]
# 初始化
for i in range(n):
    dp[i][0] = int(s[0 : i + 1])
# 乘号个数
for i in range(1, k + 1):
    # s[0...j]
    for j in range(i + 1, n):
        # 考虑分界点
        for p in range(i - 1, j):
            dp[j][i] = max(dp[j][i], dp[p][i-1] * int(s[p + 1 : j + 1]))
print(dp[n-1][k])

复杂度分析

时间复杂度为 O ( K N 2 ) O(KN^2) O(KN2)文章来源地址https://www.toymoban.com/news/detail-775650.html

到了这里,关于动态规划 | 乘积最大的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 【七】【C语言\动态规划】最大子数组和、环形子数组的最大和、乘积最大子数组,三道题目深度解析

    【七】【C语言\动态规划】最大子数组和、环形子数组的最大和、乘积最大子数组,三道题目深度解析

    动态规划就像是解决问题的一种策略,它可以帮助我们更高效地找到问题的解决方案。这个策略的核心思想就是将问题分解为一系列的小问题,并将每个小问题的解保存起来。这样,当我们需要解决原始问题的时候,我们就可以直接利用已经计算好的小问题的解,而不需要重

    2024年02月03日
    浏览(12)
  • 罗勇军 →《算法竞赛·快冲300题》每日一题:“乘积” ← 动态规划

    【题目来源】 http://oj.ecustacm.cn/problem.php?id=1781 http://oj.ecustacm.cn/viewnews.php?id=1023 【题目描述】 给你一个长度为 n 的序列,序列中的元素只包括 1 和 -1。 请问有多少个连续的子序列乘积为正数。 【输入格式】 输入第一行为正整数 n。(n不超过10^6) 第二行包含 n 个整数。 【输

    2024年02月11日
    浏览(12)
  • 【手撕算法|动态规划系列No.4】leetcode91. 解码方法

    【手撕算法|动态规划系列No.4】leetcode91. 解码方法

    个人主页:平行线也会相交 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 🍔本专栏旨在提高自己算法能力的同时,记录一下自己的学习过程,希望对大家有所帮助 🍓希望我们一起努力、成长,共同进步。

    2024年02月12日
    浏览(12)
  • 【手撕算法|动态规划系列No.3】leetcode746. 使用最小花费爬楼梯

    【手撕算法|动态规划系列No.3】leetcode746. 使用最小花费爬楼梯

    个人主页:平行线也会相交 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 🍔本专栏旨在提高自己算法能力的同时,记录一下自己的学习过程,希望对大家有所帮助 🍓希望我们一起努力、成长,共同进步。

    2024年02月12日
    浏览(9)
  • 【手撕算法|动态规划系列No.2】leetcode面试题 08.01. 三步问题

    【手撕算法|动态规划系列No.2】leetcode面试题 08.01. 三步问题

    个人主页:平行线也会相交 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 🍔本专栏旨在提高自己算法能力的同时,记录一下自己的学习过程,希望对大家有所帮助 🍓希望我们一起努力、成长,共同进步。

    2024年02月12日
    浏览(11)
  • 【手撕算法|动态规划系列No.1】leetcode1137. 第 N 个泰波那契数

    【手撕算法|动态规划系列No.1】leetcode1137. 第 N 个泰波那契数

    个人主页:平行线也会相交 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 🍔本专栏旨在提高自己算法能力的同时,记录一下自己的学习过程,希望对大家有所帮助 🍓希望我们一起努力、成长,共同进步。

    2024年02月11日
    浏览(9)
  • 算法导论-分而治之-最大子数组(含动态规划解法)

    分治法 把一个问题分成(同类的)几个子问题。 递归地解决(征服)每个子问题。 将子问题的解决方案组合成整体解决方案。 通常的使用 将大小为n的问题分成两个大小为n / 2的子问题。 递归求解(攻克)两个子问题。 将两个方案组合成整体方案。 当子问题足够大以进行递归求解

    2024年02月03日
    浏览(10)
  • 【数据结构与算法】Kadane‘s算法(动态规划、最大子数组和)

    【数据结构与算法】Kadane‘s算法(动态规划、最大子数组和)

    Kadane\\\'s 算法是一种用于解决最大子数组和问题的动态规划算法。这类问题的目标是在给定整数数组中找到一个连续的子数组,使其元素之和最大(数组含有负数)。 算法的核心思想是通过迭代数组的每个元素,维护两个变量来跟踪局部最优解和全局最优解。 以下是Kadane’s算

    2024年03月22日
    浏览(18)
  • 【算法思考记录】动态规划入门!力扣2606. 找到最大开销的子字符串【Python3、动态规划】

    原题链接 动态规划(Dynamic Programming,简称 DP)是一种通过将原问题分解为相互重叠的子问题并只解决一次的方法来解决问题的算法优化技术。动态规划通常用于优化递归问题,通过存储子问题的解来避免重复计算,从而显著提高算法的效率。 动态规划的基本思想是将原问题

    2024年02月03日
    浏览(17)
  • 最大子矩阵(openjudge noi-2.6基本算法之动态规划-1768)

    最大子矩阵(openjudge noi-2.6基本算法之动态规划-1768)

    来源 OpenJudge - 1768:最大子矩阵 题目描述 已知矩阵的大小定义为矩阵中所有元素的和。给定一个矩阵,你的任务是找到最大的非空(大小至少是1 * 1)子矩阵。 比如,如下4 * 4的矩阵  0        -2        -7        0  9         2        -6        2 -4      

    2024年04月26日
    浏览(9)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包