【蓝桥杯国赛】动态规划

news2024/11/18 5:36:48

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

要格外注意,每一次 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] = 1

for 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] += 1
        dp[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.提取出不同的等差数列组,每组的数差值为k
    for 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 datetime

N, 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+1
    dayV.append([days, v])

# 对日期进行排序
dayV.sort(key=lambda dayV:dayV[0])
dayV = [[0,0]] + dayV

dp = [0]*(N+1)
dp[1] = dayV[1][1]
for i in range(2,N+1):
    # 寻找上一张时间最接近的票据
    k = i-1
    while k>0:
        if dayV[i][0]-dayV[k][0] >= K:
            break
        k -= 1
    # 找到票据 且 小于最大金额限制
    if dp[k]+dayV[i][1]<=M:
      dp[i] = max(dp[i-1], dp[k]+dayV[i][1])
        
print(max(dp))

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

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

相关文章

海外媒体通稿:9个极具创意的旅游业媒体推广案例分享-华媒舍

如今&#xff0c;旅游业正迅速发展&#xff0c;媒体推广成为吸引游客的关键。为了更好地展示旅游目的地&#xff0c;许多创意而富有创新的媒体推广策略应运而生。本文将介绍九个极富创意的旅游业媒体推广案例&#xff0c;为广大从业者带来灵感和借鉴。 1. 视频系列&#xff1a;…

参数设置错误导致的 OOM

参数设置错误导致的 OOM 前言事故分析事故原因事故复盘 前言 2024 年 5 月 10 日 14 时 19 分&#xff0c;C 公司开发人员向 A 公司开发人员反映某开放接口从 2024 年 5 月 10 日 14 时许开始无法访问和使用。该系统为某基础数据接口服务&#xff0c;基于 HTTP 协议进行通信。…

【吊打面试官系列】Java高并发篇 - 什么是线程调度器(Thread Scheduler)和时间分片(TimeSlicing)?

大家好&#xff0c;我是锋哥。今天分享关于 【什么是线程调度器(Thread Scheduler)和时间分片(TimeSlicing)&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; 什么是线程调度器(Thread Scheduler)和时间分片(TimeSlicing)&#xff1f; 线程调度器是一个操作系统服…

【从零开始部署SAM(Segment Anything Model )大模型 3 Ubuntu20 离线部署 C++】

这里是目录 总览环境配置模型准备Moble SAM onnx模型获取Moble SAM pre onnx模型获取 运行cmakelist 运行结果 总览 相比于使用python离线部署SAM大模型&#xff0c;C要麻烦的多&#xff0c;本篇的部署过程主要基于项目&#xff1a;https://github.com/dinglufe/segment-anyth…

数据结构与算法02-排序算法

介绍 排序算法是计算机科学中被广泛研究的一个课题。历时多年&#xff0c;它发展出了数十种算法&#xff0c;这些 算法都着眼于一个问题&#xff1a;如何将一个无序的数字数组整理成升序&#xff1f;先来学习一些“简单排序”&#xff0c;它们很好懂&#xff0c;但效率不如其他…

Git系列:rev-parse 使用技巧

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

vmware workstation 17.0.0 ubuntu删除快照导致无法启动的问题打不开磁盘xxxxxxx或它所依赖的某个快照磁盘

在使用vmware workstation的时候 在我删除多余的快照的时候&#xff0c;发现删除快照后打不开虚拟机了&#xff0c; 提示&#xff1a; 打不开此虚拟磁盘的父磁盘打不开磁盘“D:\Virtual Machines\Ubuntu 64 位\Ubuntu 64 位-000003.vmdk”或它所依赖的某个快照磁盘。模块“Dis…

曾巩,散文的艺术与哲思

曾巩&#xff0c;字子固&#xff0c;世称南丰先生&#xff0c;南丰&#xff08;今江西&#xff09;人&#xff0c;生于北宋真宗天禧三年&#xff08;公元1019年&#xff09;&#xff0c;卒于北宋元丰六年&#xff08;公元1083年&#xff09;&#xff0c;享年64岁。他是中国北宋…

低功耗蓝牙模块在便携式医疗设备上的应用前景

随着科技的不断发展&#xff0c;医疗设备的便携性和智能化已经成为了一种趋势。在这个背景下&#xff0c;低功耗蓝牙模块(Bluetooth Low Energy,简称BLE)作为一种先进的无线通信技术&#xff0c;正逐渐在便携式医疗设备中发挥着越来越重要的作用。本文美迅物联网MesoonRF将探讨…

Debian和ubuntu 嵌入式的系统的 区别

随着开源操作系统的日益流行&#xff0c;Debian和Ubuntu这两个基于Linux的发行版本成为了众多开发者和系统管理员的首选。它们各自拥有独特的优势和特点&#xff0c;那么&#xff0c;在选择时&#xff0c;哪一个更适合你呢&#xff1f;接下来&#xff0c;我们将深入探讨两者的关…

计算机网络——如何保证 TCP 传输的可靠性

TCP 是传输层上的协议&#xff0c;它是可靠的&#xff0c;面向连接的。 概括 1. 设置传输格式&#xff0c;包括分为 TCP 段、使用校验和、使用序列号 2. 数据丢失之后的重传&#xff0c;超时重传、快速重传、SACK 选择确认、D-SACK 重复选择确认 3. 流量控制&#xff0c;控…

python编程:SQLite 管理图片数据库

在本博客中&#xff0c;我们将介绍如何使用 wxPython 和 sqlite3 模块构建一个 GUI 应用程序&#xff0c;该程序可以遍历指定文件夹中的所有图片&#xff0c;并将其信息存储到 SQLite 数据库中。 C:\pythoncode\new\InputImageOFFolderTOSqlite.py 项目简介 我们的目标是创建…

linux可观测性ebpf(一) ----------- 环境搭建

参考书籍 开发环境 Ubuntu 18.04.6 LTS (GNU/Linux 5.4.0-150-generic x86_64) 1.1 下载内核源码 cd /usr/src/ sudo git clone -b v5.4 https://github.com/torvalds/linux.git1.2 下载书中代码 git clone https://github.com/bpftools/linux-observability-with-bpf1.3 编…

Java常用API(三)

一、Arrays类 1.定义 Arrays是一个用于操作数组的工具类。 2.常用方法 1.toString方法 public class Demo {public static void main(String[] args) {//toString 将数组变成字符串int[] arr {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};System.out.println(Arrays.toString(arr));…

arduino 与 nodeMcu 之间的通信

一、前言 当在 arduino 板子处理好了传感器的数据应该发送给远程服务器这时候就需要用 nodeMcu 了&#xff0c;但是怎么把 arduino 的数据发送到 nodeMcu 呢&#xff0c;这就是本文要实现的。 两个板子之间通信很简单&#xff0c;直接使用 arduino IDE 提供的 Serial.println…

Java web应用性能分析之【压测工具ab】

常用的性能测试工具有&#xff1a;JMeter、loadRunner、ab&#xff1b;对于开发人员来说用的多的是免费的Jmeter和ab&#xff0c;对于测试来说可能用收费的商业软件loadRunner多。在这里我们就说说ab压测工具&#xff0c;因为ab基本满足web接口测试要求&#xff0c;jmeter后面再…

详解生成式人工智能的开发过程

回到机器学习的“古老”时代&#xff0c;在您可以使用大型语言模型&#xff08;LLM&#xff09;作为调优模型的基础之前&#xff0c;您基本上必须在所有数据上训练每个可能的机器学习模型&#xff0c;以找到最佳&#xff08;或最不糟糕&#xff09;的拟合。 开发生成式人工智能…

学习网站地址汇总

本文用于记录学习路上遇到问题&#xff0c;各位大神的分享笔记&#xff0c;内容包括数据库的安装卸载&#xff0c;基础使用&#xff0c;sql语句编写&#xff0c;计算机网络知识等&#xff0c;属于知识大杂烩 1.动态行转列&#xff1a;https://www.cnblogs.com/gaizai/p/375329…

【设计模式深度剖析】【B】【结构型】【对比】| 主要区别包装的不同

&#x1f448;️上一篇:享元模式 回 顾&#xff1a;结构型设计模式 1.代理模式&#x1f448;️ 2.装饰器模式&#x1f448;️ 3.适配器模式&#x1f448;️ 4.组合模式&#x1f448;️ 5.桥接模式&#x1f448;️ 6.外观模式&#x1f448;️ 7.享元模式&#x…

Java操作Excel文档进行读取和写入

目录 读出Excel文档 写入Excel文档 读出Excel文档 使用EasyExcel读取Excel文件: 需要在maven项目中导入EasyExcel依赖 <!-- EasyExcel依赖包 --> <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><v…