蓝桥杯 算法训练 乘积最大Python实现(动态规划)详细

2023-10-27

资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述

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

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

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

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

3 * 12=36
31 * 2=62

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

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

输入格式

程序的输入共有两行:
  第一行共有2个自然数N,K(6≤N≤40,1≤K≤6)
  第二行是一个长度为N的数字串。

输出格式

输出所求得的最大乘积(一个自然数)。

样例输入

4 2
1231
样例输出
62

分析:
这是一道很典型的动态规划题目。我们首先来看题给的例子。
1231,四位数,放两个乘号,可以是:
1 ∗ 2 ∗ 31 = 62 1 * 2 * 31 = 62 1231=62
12 ∗ 3 ∗ 1 = 36 12 * 3 * 1 = 36 1231=36
我们肯定选择62的那个结果,我们再把例子简化一点,比如123三位数插入两个乘号,这没得选,肯定是1 * 2 * 3,一步一步来,123先插入一个乘号:1 * 23或者12 * 3,我们选择12 * 3,然后我们在做123插入两个乘号的,在插入一个乘号的结果中,在12里面插入一个乘号就变成1 * 2 * 3了。这就是说我们的大问题会依赖于我们的小问题,所以动态规划就来了。

我们用dp数组来动态规划,dp[x][y]就表示x位数有y个乘号的最大结果,我们先填充第一列:
在这里插入图片描述
注意:
10 + 2 = 12 10+2=12 10+2=12
12 ∗ 100 + 3 = 123 12*100+3=123 12100+3=123
123 ∗ 10 + 1 = 1231 123*10+1=1231 12310+1=1231
我们的第一列数据就是这么来的。

接下来看第二列数据,只填充一个乘号。x必须大于y,数字肯定要比符号多,我们还是看123三位数,1 * 23或者12*3,就是让乘号在数字的“缝隙”之间跑,所以我们用z表示乘号的位置,那么z的范围应该是1<=z<x,先给第二列写好:
第二列我们可以依赖通式:
d p [ x ] [ y ] = m a x ( d p [ x ] [ y ] , d p [ z ] [ 0 ] ∗ ( d p [ x ] [ 0 ] − d p [ z ] [ 0 ] ∗ 10 ∗ ∗ ( x − z ) ) ) dp[x][y] = max(dp[x][y], dp[z][0] * (dp[x][0]-dp[z][0] * 10**(x-z))) dp[x][y]=max(dp[x][y],dp[z][0](dp[x][0]dp[z][0]10(xz)))
在这里插入图片描述
第三列怎么做呢,因为第三列的结果依赖于第二列,第三列的通式是:
d p [ x ] [ y ] = m a x ( d p [ x ] [ y ] , d p [ z ] [ y − 1 ] ∗ ( d p [ x ] [ 0 ] − d p [ z ] [ 0 ] ∗ 10 ∗ ∗ ( x − z ) ) ) dp[x][y] = max(dp[x][y], dp[z][y-1] * (dp[x][0] - dp[z][0] * 10**(x-z))) dp[x][y]=max(dp[x][y],dp[z][y1](dp[x][0]dp[z][0]10(xz)))
只是把第二列的 d p [ z ] [ 0 ] 改 成 d p [ z ] [ y − 1 ] dp[z][0]改成dp[z][y-1] dp[z][0]dp[z][y1],举个例子:

d p [ 4 ] [ 2 ] = 1 ∗ 2 ∗ 31 dp[4][2] = 1 * 2 * 31 dp[4][2]=1231
换成dp数组表示就是:
d p [ 4 ] [ 2 ] = d p [ 2 ] [ 1 ] ∗ ( d p [ 4 ] [ 0 ] − d p [ 2 ] [ 0 ] ∗ 1 0 2 ) dp[4][2] = dp[2][1] * (dp[4][0] - dp[2][0] * 10^2) dp[4][2]=dp[2][1](dp[4][0]dp[2][0]102)

d p [ 4 ] [ 2 ] 还 可 以 是 : d p [ 4 ] [ 2 ] = 12 ∗ 3 ∗ 1 dp[4][2]还可以是: dp[4][2] = 12 * 3 * 1 dp[4][2]dp[4][2]=1231
换成dp数组表示就是:
d p [ 4 ] [ 2 ] = d p [ 3 ] [ 1 ] ∗ ( d p [ 4 ] [ 0 ] − d p [ 3 ] [ 0 ] ∗ 1 0 1 ) dp[4][2] = dp[3][1] * (dp[4][0] - dp[3][0] * 10^1) dp[4][2]=dp[3][1](dp[4][0]dp[3][0]101)

AC代码:

while True:
    try:
        n,k = map(int,input().split())
        s = list(input())   #此时的列表数据都是str类型
        dp = [[0 for i in range(k+1)]for j in range(n+1)]    #动规的数组
        dp[1][0] = int(s[0])
        for i in range(2, n+1):
            dp[i][0] = int(s[i-1])+int(dp[i-1][0])*10    #往动规数组放的时候要转化成int类型,输入数组的第一列
        for y in range(1,k+1):     #y个乘号
            for x in range(1,n+1):   #x位数
                if x>y:
                    for z in range(1,x):  #乘号,动态地在数字之间跑
                        dp[x][y] = max(dp[x][y], dp[z][y-1]*(dp[x][0]-dp[z][0]*10**(x-z)))
        print(dp[n][k])
    except:
        break

编程小白记录成长

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

蓝桥杯 算法训练 乘积最大Python实现(动态规划)详细 的相关文章

  • 0动态规划中等 NC206 跳跃游戏(二)

    NC206 跳跃游戏 二 描述 给定一个非负整数数组nums 假定最开始处于下标为0的位置 数组里面的每个元素代表下一跳能够跳跃的最大长度 如果可以跳到数组最后一个位置 请你求出跳跃路径中所能获得的最多的积分 1 如果能够跳到数组最后一个位
  • 2018年第九届蓝桥杯C/C++A组省赛 题面&部分题解

    首先 原题 链接 https pan baidu com s 1UzRN6Mf2Dwp0263F MMESg 密码 2ryh 第一题 标题 分数 1 1 1 2 1 4 1 8 1 16 每项是前一项的一半 如果一共有20项 求这个和是多少
  • 华为od机考真题-HJ17坐标移动(中等)

    data input l r 0 0 for ad in data split ad
  • OJ刷题---【算法课动态规划] 换硬币(C++完整代码)

    题目 给定面值分别为2 5 7的硬币 每种硬币有无限个 给定一个N 求组成N最少需要的硬币的数量 若无法组成则返回 1 输入 输入N 1 lt N lt 100 输出 输出需要的最少硬币个数 完整代码 C include
  • 【算法竞赛】Python快速入门指南

    该指南由GPT4编写 用于快速入门蓝桥杯Python组 当然 仅限入门而已 本指南由GPT 4生成 我只是负责引导 并对内容进行整理和补充 一直以来我都是使用C 作为算法竞赛语言 但是奈何C 组太卷 自己又太菜 于是另谋他路 Prompt模
  • 第十四届蓝桥杯程序设计C++B组 (详细图解+保姆级注释)

    0 写在前面 本届CB组题目难度较往年整体提升了一些 考察知识点全面 题目质量很高 推荐备赛蓝桥杯或感兴趣的同学深入研究本套题 废话不多说 直接上干货 一 冶炼金属 签到题难度 考察数论分块知识or二分 有部分同学可能知道下取整的定义 但是
  • 要求输入月份,判断该月所处的季节并输出季节(假设:12、1、2 月为冬季,依次类推)

    public class Task 10101003 03 public static void main String args Scanner input new Scanner System in System out println
  • OD机试题目【计算网络信号】

    网络信号经过传递会逐层衰减 且遇到阻隔物无法直接穿透 在此情况下需要计算某个位置的网络信号值 注意 网络信号可以绕过阻隔物 array m n 的二维数组代表网格地图 array i j 0代表i行j列是空旷位置 array i j x x
  • 《算法图解》第九章动态规划学习心得

    1 背包问题 动态规划先解决子问题 再逐步解决大问题 每个动态规划都从一个网格开始 背包问题的网格如下 网格最初是空的 动态规划就是逐步将网格填满 吉他行 第一个单元格表示背包的容量为1磅 吉他的重量也是1磅 这意味着它能装入背包 因此这个
  • 蓝桥杯C/C++百校真题赛(3期)Day3(考勤刷卡、最大和)

    Day3 Q1 考勤刷卡 Q2 最大和 Q1 考勤刷卡 问题描述 小蓝负责一个公司的考勤系统 他每天都需要根据员工刷卡的情况来确定 每个员工是否到岗 当员工刷卡时 会在后台留下一条记录 包括刷卡的时间和员工编号 只 要在一天中员工刷过一次卡
  • 3254 Corn Fields 这题解真的不能再详细了!

    题意 农场主John新买了一块长方形的新牧场 这块牧场被划分成 M M M行 N N N列 1
  • 每日一练-仓库日志

    仓库日志 题目描述 解题思路 Python源码 Summary Date 2023年1月9日 Author 小 y 同 学 Classify 蓝桥杯每日一练 Language Python 题目描述 题意 M海运公司最近要对旗下仓库的货物进
  • 2023蓝桥杯python 组试题A:2023

    题目 请求出在 12345678 至 98765432 中 有多少个数中完全不包含 2023 完全不包含 2023 是指无论将这个数的哪些数位移除都不能得到 2023 例如 20322175 33220022 都完全不包含 2023 而 2
  • 蓝桥杯-稍大的字符串

    题目 标题 稍大的串 串可以按照字典序进行比较 例如 abcd 小于 abdc 如果给定一个串 打乱组成它的字母 重新排列 可以得到许多不同的串 在这些不同的串中 有一个串刚好给定的串稍微大一些 科学地说 它是大于已知串的所有串中最小的串
  • 七段码(建图+搜索+并查集)

    思路 step1 邻接表建图 相邻为1 不相邻为0 题目就等价为在图中求连通子图的个数 step2 深度搜索每条边 并存储下来 step3 对选择的边用并查集保存下来 然后看father i i的个数 等于1 表示连通 否则表示不连通 易错
  • 多少个X 蓝桥杯模拟

    问题描述 给定一个字母矩阵 一个 X 图形由中心点和由中心点向四个45度斜线方向引出的直线段组成 四条 线段的长度相同 而且四条线段上的字母和中心点的字母相同 一个 X图形可以使用三个整数 r c L 来描述 其中 r c 表示中心点位于第
  • 背包九讲-01背包

    动态规划核心思维能力 动态规划是求最优解问题的重要解法 也是信息学奥赛中每年必考的内容之一 学习动态规划更应该注重此类问题思维能力的锻炼 多多做题 一般 gt 50题后方可入门 注意理解以下概念 1 状态 2 状态属性 3 状态的计算 也就
  • shared_ptr使用场景、陷阱、性能分析,使用建议

    1 std shared ptr使用场景 include
  • 字符串处理-第11届蓝桥杯省赛Python真题精选

    导读 超平老师的Scratch蓝桥杯真题解读系列在推出之后 受到了广大老师和家长的好评 非常感谢各位的认可和厚爱 作为回馈 超平老师计划推出 Python 蓝桥杯真题解析100讲 这是解读系列的第26讲 字符串处理 本题是2020年6月20
  • 如何查看崩溃日志

    目录 描述 思路 查看ipa包崩溃日志 简单查看手机崩溃信息几种方式 方式1 手机设置查看崩溃日志 方式2 Xocde工具 方式3 第三方软件克魔助手 环境配置 实时日志 奔溃日志分析 方式四 控制台资源库 线上崩溃日志 线上监听crash

随机推荐