【蓝桥杯国赛】动态规划

“动态规划”在蓝桥杯中的出题类型,主要为两种,

要格外注意,每一次 dp 的迭代更新,都是针对于当前位置下的“所有情况”进行的,

应着眼于当前位置的每一种情况。

类型一:一共有多少种情况?

1. 第十届JavaB组:平方拆分

难度:⭐⭐⭐
思考分析
square = []
for i in range(44+1):square.append(i**2)dp = [[0]*2020 for _ in range(len(square))]
dp[0][0] = 1    #初始条件:两数相等为一种情况
for i in range(1,len(square)):for j in range(2019+1):if j<square[i]:dp[i][j] = dp[i-1][j]else:dp[i][j] = dp[i-1][j] + dp[i-1][j-square[i]]
print(dp[-1][2019])

2. 第十三届C/C++B组:2022

难度:⭐⭐⭐⭐
思考分析(三维dp+三层循环)

可以将此题看成一个背包装物品,只能装10件物品,且重量恰好为2022.

这次的“背包问题”额外增加了对物品的数量限制,“二维dp”可能较难处理;

因此升级为“三维dp”,多一个维度来记录物品的数量。

dp[i][j][k] 表示在1~i个体积的物品中, 选取了j个物品, 和为k,数量的多少。

最后,dp[2022][10][2022] 表示:在2022件物品中,选择了10件物品,且和为2022,的数量。

"""索引作为推导过程 值作为种类"""
dp = [[[0]*2030 for _ in range(11)] for _ in range(2030)]"""初始化:"在第1~i个体积的物品中, 选取了0个, 和为0"的情况为1"""
for i in range(2023):dp[i][0][0] = 1for i in range(1,2023):for j in range(1,11):for k in range(1,2023):if k < i: """当前第i个物品的体积小于和k 只能照搬"""dp[i][j][k] = dp[i-1][j][k]else:"""在这i个物品中,选择当前第i个物品, 则dp[i-1][j-1][k-i]不选择当前第i个物品, 则直接照搬dp[i-1][j][k]"""dp[i][j][k] = dp[i-1][j][k] + dp[i-1][j-1][k-i]
print(dp[2022][10][2022])

3. 第十四届C/C++B组:子2023

难度:⭐⭐⭐⭐

思考分析

每多增加一个“2”,dp[0]+1,且对应的“202”的数目(dp[2])也会增加1*dp[1]个;

每多增加一个“0”,“20”的数目(dp[1])会增加1*dp[0]个;

每多增加一个“3”,“2023”的数目(dp[3])会增加多1*dp[2]个。

seq = ''
for i in range(1,2023+1):seq += str(i)s = ''
for t in seq:if t in ['2','0','2','3']:s += t"""分别代表 2 20 202 2023"""
dp = [0]*4
for t in s:if t=='2':dp[0] += 1dp[2] += dp[1]if t=='0':dp[1] += dp[0]if t=='3':dp[3] += dp[2]
print(dp[-1])

类型二:最值问题。

1. 第十四届pythonB组:翻转

难度:⭐⭐⭐⭐

思考分析

对于每个按顺序衔接的字符串而言,它一共有四种情况:翻转+翻转,正常+翻转,翻转+正常,正常+正常。

# 拼接字符长度最短
n = int(input())
s = []
for _ in range(n):s.append(input())dp1 = [2]*n #第一个字符串未翻转
dp2 = [2]*n #第一个字符串翻转for i in range(1,n):    #对于当前第i个字符串dp1[i] = min(dp1[i-1]+2-(s[i-1][1]==s[i][0]),dp2[i-1]+2-(s[i-1][0]==s[i][0]))dp2[i] = min(dp1[i-1]+2-(s[i-1][1]==s[i][1]),dp2[i-1]+2-(s[i-1][0]==s[i][1]))print(min(dp1[-1],dp2[-1]))

2. 第十一届pythonB组:本质上升序列

难度:⭐⭐⭐

思考分析(具体可参考)

(蓝桥杯第十一届决赛)试题D:本质上升序列(动态规划)_蓝桥杯本质上升序列答案-CSDN博客

s = """tocyjkdzcieoiodfpbgcncsrjbhmugdnojjddhllnofawllbhfiadgdcdjstemphmnjihecoapdjjrprrqnhgccevdarufmliqijgihhfgdcmxvicfauachlifhafpdccfseflcdgjncadfclvfmadvrnaaahahndsikzssoywakgnfjjaihtniptwoulxbaeqkqhfwl"""
dp = [1]*len(s)
for i in range(len(s)):for j in range(i):if s[i] > s[j]:dp[i] += dp[j]elif s[i] == s[j]:dp[i] -= dp[j]
print(sum(dp))

3. 第八届C/C++B组:对局匹配

难度:⭐⭐⭐

思考分析

①输入里存在相同数字,相同数字可以同时出现在“匹配”中;因此需要对数字进行去重,并将其作为接下来每一步“动态规划”的weight。与此同时,这对输入进行了“平滑处理”。

提取出不同的等差数列组,每组数的差值为k.(取到了所有数字)

分成k组:{0,0+k,0+2k,...}, {1,1+k,1+2k,...}, {2,2+k,2+2k,...}, {k-1, 2k-1, 3k-1,...}

③对每一组等差数列进行“动态规划”,遵循一个原则:不能选择相邻的数字

dp=max(dp[j-1],dp[j-2]+val[j])

n, k = map(int,input().split())
nums = list(map(int, input().split()))if not k:print(len(set(nums)))
else:ans = 0# 1.给数字们计数cnts = [0]*(max(nums)+1)for i in range(len(nums)):cnts[nums[i]] += 1# 2.提取出不同的等差数列组,每组的数差值为kfor i in range(k):#记录每个数的出现次数val = []  for j in range(i,len(cnts),k):val.append(cnts[j])#动态规划:不能选相邻位置dp = [0]*len(val)dp[0] = val[0]dp[1] = max(val[0], val[1])for j in range(2,len(val)):dp[j] = max(val[j]+dp[j-2], dp[j-1])#添加进总次数ans += dp[-1]print(ans)

4. 第十三届C/C++B组:费用报销

难度:⭐⭐⭐⭐

思考分析

①注意日期的限制条件,将所有日期都转换为天数;根据日期的大小对票据进行排序。

②结合题意,寻找”最大值“,因此只需要设置“一维dp”即可;若设置“二维dp”,会超时。

③寻找上一张时间最接近的票据,

dp[i]=max(dp[i-1],dp[k]+v[i])

import datetimeN, M, K = map(int, input().split())
dayV = []
tmp_days = datetime.datetime(2001,1,1)  #随意取一个非闰年的年份
for i in range(N):month, day, v = map(int, input().split())# 将日期转化为天数current_date = datetime.datetime(2001,month,day)days = (current_date-tmp_days).days+1dayV.append([days, v])# 对日期进行排序
dayV.sort(key=lambda dayV:dayV[0])
dayV = [[0,0]] + dayVdp = [0]*(N+1)
dp[1] = dayV[1][1]
for i in range(2,N+1):# 寻找上一张时间最接近的票据k = i-1while k>0:if dayV[i][0]-dayV[k][0] >= K:breakk -= 1# 找到票据 且 小于最大金额限制if dp[k]+dayV[i][1]<=M:dp[i] = max(dp[i-1], dp[k]+dayV[i][1])print(max(dp))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/19910.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Flutter 中的 ScrollConfiguration 小部件:全面指南

Flutter 中的 ScrollConfiguration 小部件&#xff1a;全面指南 Flutter 是一个功能强大的 UI 框架&#xff0c;它允许开发者使用 Dart 语言来构建高性能、美观的移动、Web 和桌面应用。在 Flutter 中&#xff0c;滚动是用户界面中一个常见的交互元素。ScrollConfiguration 是…

使用 Apache Commons Exec 自动化脚本执行实现 MySQL 数据库备份

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…

C# 中的字符与字符串

简介 在C#编程语言中&#xff0c;字符和字符串是处理文本数据的基础。字符是单个的字母或符号&#xff0c;而字符串是字符的集合。本篇博客将详细介绍C#中的字符类型 char 和字符串类型 string&#xff0c;以及它们的基本操作。 字符类型 char char 类型在C#中用于表示单个字…

Part 3.1 深度优先搜索

深度优先搜索&#xff08;DFS&#xff09;&#xff0c;即按照深度优先的顺序搜索的算法。 深度优先搜索一般使用栈来实现。 [USACO1.5] 八皇后 Checker Challenge 题目描述 一个如下的 6 6 6 \times 6 66 的跳棋棋盘&#xff0c;有六个棋子被放置在棋盘上&#xff0c;使得…

介绍HDD、SSD、U盘:存储技术的恢复原理与安全保存私密文件的方法

随着数字存储技术的飞速发展&#xff0c;硬盘驱动器&#xff08;HDD&#xff09;、固态驱动器&#xff08;SSD&#xff09;和USB闪存驱动器&#xff08;U盘&#xff09;已经成为我们日常生活中不可或缺的部分。尽管这些设备在存储数据方面表现出色&#xff0c;但数据丢失问题仍…

Vue不使用v-model的时候怎么监听数据变化?

在Vue中&#xff0c;如果你不想使用v-model来监听数据变化&#xff0c;你仍然可以通过其他几种方式来实现。v-model实际上是v-bind&#xff08;或简写为:&#xff09;和v-on&#xff08;或简写为&#xff09;的语法糖&#xff0c;它同时处理了数据的双向绑定&#xff1a;将值绑…

go解析yaml

go解析yaml文件关键就是结构体的创建 初学go tag字段要和yaml文件中的key对应起来&#xff0c;每个层级都要创建对应的结构体&#xff0c;有点烦 package configimport ("gopkg.in/yaml.v3""os" )type Config struct {MysqlConfig MysqlConfig yaml:&q…

开发nfc读卡器应用出现报错Unhandled Exception: SCARD_E_NO_SERVICE

使用flutter开发ACR122U的nfc读卡器的时候&#xff0c;报错&#xff1a; [ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: Exception: Error while establing context. Reason: SCARD_E_NO_SERVICE #0 PCSCBinding._checkAndThrow (package:fl…

Flink实现实时异常登陆监控(两秒内多次登陆失败进行异常行为标记)

Flink实现异常登陆监控&#xff08;两秒内多次登陆失败进行异常行为标记&#xff09; 在大数据处理领域&#xff0c;Apache Flink 是一个流行的开源流处理框架&#xff0c;能够高效处理实时数据流。在这篇博客中&#xff0c;我们将展示如何使用 Apache Flink 从 MySQL 中读取数…

bug清单问题

1. embedding 层 index out of range in self 原因&#xff1a; 一般是因为模型的vocab_size与提供的vocab.txt文件的词大小不一致。 检查方法&#xff1a; 可通过以下方法&#xff0c;查看tensor的最大最小值# print(token_ids, token_ids.max(), token_ids.min()) # &…

科研数据分析常见问题

许多使用SPSSAU进行初次科研数据分析的同学&#xff0c;可能对数据分析方法的深层原理和研究思路缺乏全面的把握。因此&#xff0c;当导师针对数据研究方法提出具体问题时&#xff0c;他们可能会感到些许困惑或难以立即给出满意的答复。鉴于此&#xff0c;SPSSAU汇总了一些常见…

【工具】创客贴会员|创客贴截止2024年6月所有AI功能效果实测(热门推荐和图片编辑部分)

上一篇&#xff1a;【工具】创客贴会员&#xff5c;万字测评&#xff01;前沿设计网站创客贴的 AI 文生图效果测评 上一篇写的时候只测了文生图&#xff0c;因为百度那边活动没和创客贴接洽好&#xff0c;他们不清楚创客贴的AI和其他会员功能分开了&#xff0c;导致只有10次体…

什么是AVIEXP提前发货通知?

EDI&#xff08;电子数据交换&#xff09;报文是一种用于电子商务和供应链管理的标准化信息传输格式。AVIEXP 是一种特定类型的 EDI 报文&#xff0c;用于传输提前发货通知信息。 AVIEXP 报文简介 AVIEXP 是指 Advanced Shipping Notification提前发货通知报文&#xff0c;用…

virtualbox中ubuntu22.04网络配置

第一&#xff1a;添加两个网卡&#xff0c;网卡1是NAT方式&#xff0c;网卡2是仅主机模式&#xff08;两个顺序不能颠倒&#xff09; 第二步&#xff1a;启动ifconfig查看网络

搭载昇腾310NPU的Orange Pi AIpro开箱体验以及深度学习样例测试

Orange Pi AIpro开箱体验以及样例测试 随着人工智能和物联网技术的快速发展&#xff0c;单板计算机&#xff08;Single Board Computer, SBC&#xff09;在创客和开发者社区中越来越受到欢迎。我最近入手了一款高性能的单板计算机——Orange Pi AIpro。 在入手此款AI开发板之…

探索 Ollama: 你的本地 AI 助手

本期推荐的开源项目是 Ollama&#xff0c;它是一款本地大模型运行工具&#xff0c;可以帮助用户轻松下载和运行各种大型语言模型&#xff08;LLM&#xff09;&#xff0c;而无需将数据上传到云端。以下是关于 Ollama 的介绍以及安装和使用教程&#xff1a; Ollama 是什么&#…

VB.net 进行CAD二次开发(二)

利用参考文献2&#xff0c;添加面板 执行treeControl New UCTreeView()时报一个错误&#xff1a; 用户代码未处理 System.ArgumentException HResult-2147024809 Message控件不支持透明的背景色。 SourceSystem.Windows.Forms StackTrace: 在 System.Windows…

SpringBoot 配置上下文路径 ​server.servlet.context-path

SpringBoot 2.0 以下配置上下文路径 ​server.context-path/demoSpringBoot 2.0 以上配置上下文路径 ​server.servlet.context-path/demo默认的上下文路径 不配置上下文路径时&#xff0c;默认的上下文路径为 /。 相当于配置上下文路径&#xff1a; ​server.servlet.con…

Spring事务管理进阶-rollbackFor propagation

黑马程序员JavaWeb开发教程 文章目录 一、rollbackFor二、propagation2.1 事务传播行为2.2 场景 一、rollbackFor 默认情况下&#xff0c;只有初选RuntimeException才会回滚异常。roolbackFor属性用于控制出现何种异常类型&#xff0c;回滚事务。 二、propagation 用来配置事…

网络安全基础技术扫盲篇 — 名词解释之“数据包“

用通俗易懂的话说&#xff1a; 数据包就像是一个信封。当你写信给某个人时&#xff0c;你将内容写在一张纸上&#xff0c;然后将纸叠起来并放入信封中&#xff0c;就形成了一个完整要发送的数据内容。信封上有发件人和收件人的详细地址&#xff0c;还有一些其他必要的信息&…