当前位置: 首页 > news >正文

2024蓝桥杯每日一题(区间DP)

备战2024年蓝桥杯 -- 每日一题
Python大学A组

        试题一:游戏
        试题二:石子合并
        试题三:密码脱落
        试题四:能量项链


试题一:游戏

【题目描述】

        玩家一和玩家二共同玩一个小游戏。给定一个包含 N 个正整数的序列。由玩家一开始,双方交替行动。每次行动可以在数列的两端之中任选一个数字将其取走,并给自己增加相应数字的分数。(双方的初始分都是 0 分)当所有数字都被取完时,游戏结束。分更高的一方获胜。请计算,如果双方都采取最优策略进行游戏,则游戏结束时,双方的得分各是多少。

【输入格式】

        第一行包含整数 N。

        后面若干行包含 N 个整数,表示这个序列。注意每行不一定恰好包含一个数。

【输出格式】

        共一行,两个整数,分别表示玩家一和玩家二的最终得分。

【数据范围】

        2≤N≤100
        数列中的数字的取值范围为 [1,200]

【输入样例】

6
4 7 2 9
5 2

【输出样例】

18 11

【解题思路】

        采用一般的DP分析方法,f[i][j][k]表示玩家j在区间i~j的最大取值。
        所以考虑如何状态转移,它肯定是由对手1-k选左边的或者选右边的得到,也即是f[i][j][k] = max(f[i][j][k],s[j] - s[i]  - f[i+1][j][1-k] + a[i],s[j-1]-s[i-1] - f[i][j-1][1-k] + a[j]  )。最后的答案为f[1][n][0],s[j]-f[1][n][0]。

【Python程序代码】

n = int(input())
a,s = [0],[0]*(n+10)
while True:try:tep = list(map(int,input().split()))a += tepexcept:break
f = [[[0]*2 for i in range(210)] for j in range(210)]
for i in range(1,n+1):s[i] = s[i-1]+a[i]
for i in range(1,n+1):for k in [0,1]:f[i][i][k]=a[i]f[i-1][i][k]=max(a[i],a[i-1])
for i in range(n,0,-1):for j in range(i+1,n+1):for k in [0,1]:# 取右边f[i][j][k] = max(f[i][j][k], s[j-1]-s[i-1] - f[i][j-1][1-k] + a[j])# 取左边f[i][j][k] = max(f[i][j][k], s[j]-s[i] - f[i+1][j][1-k] + a[i])
print(f[1][n][0],s[j]-f[1][n][0])

试题二:石子合并

【题目描述】

        设有 N 堆石子排成一排,其编号为 1,2,3,…,N。每堆石子有一定的质量,可以用一个整数来描述,现在要将这 N 堆石子合并成为一堆。每次只能合并相邻的两堆,合并的代价为这两堆石子的质量之和,合并后与这两堆石子相邻的石子将和新堆相邻,合并时由于选择的顺序不同,合并的总代价也不相同。例如有 4 堆石子分别为 1 3 5 2, 我们可以先合并 1、2堆,代价为 4,得到 4 5 2, 又合并 1、2堆,代价为 9,得到 9 2 ,再合并得到 11,总代价为 4+9+11=24;如果第二步是先合并 2、32 堆,则代价为 7,得到 4 7,最后一次合并代价为 11,总代价为 4+7+11=22。问题是:找出一种合理的方法,使总的代价最小,输出最小代价。

【输入格式】

        第一行一个数 N 表示石子的堆数 N。

        第二行 N 个数,表示每堆石子的质量(均不超过 1000)。

【输出格式】

        输出一个整数,表示最小代价。

【数据范围】

        1≤N≤300

【输入样例】

4
1 3 5 2

【输出样例】

22

【解题思路】

        采用区间DP的方法,f[i][j]表示将区间i-j合并需要付出的最小代价,所以先枚举区间长度,然后枚举做端点,如果左端点为1则赋值f[i][j]=0,否则枚举区间断点k在i+1~j-1的范围,状态转移方程为:f[i][j] = min(f[i][j],f[i][k] + f[k+1][j] + s[j]-s[i-1]),最后的答案为f[1][n]

【Python程序代码】

n = int(input())
a = [0] + list(map(int,input().split()))
s = [0]*(n+10)
for i in range(1,n+1):s[i] = s[i-1]+a[i]
f = [[1e9]*(n+10) for _ in range(n+10)]
for le in range(1,n+1):i = 1while i+le-1<=n:j = i+le-1if le==1:f[i][j]=0i+=1continuefor k in range(i,j):f[i][j] = min(f[i][j],f[i][k]+f[k+1][j]+s[j]-s[i-1])i+=1
print(f[1][n])

试题三:密码脱落

【题目描述】

        X星球的考古学家发现了一批古代留下来的密码。这些密码是由A、B、C、D 四种植物的种子串成的序列。仔细分析发现,这些密码串当初应该是前后对称的(也就是我们说的镜像串)。由于年代久远,其中许多种子脱落了,因而可能会失去镜像的特征。你的任务是:给定一个现在看到的密码串,计算一下从当初的状态,它要至少脱落多少个种子,才可能会变成现在的样子。

【输入格式】

        共一行,包含一个由大写字母ABCD构成的字符串,表示现在看到的密码串。

【输出格式】

        输出一个整数,表示至少脱落了多少个种子。

【输入样例】

ABDCDCBABC

【输出样例】

3

【解题思路】

        其实就是求最长回文子序列,可以采用区间DP的方法,先枚举区间长度,然后枚举区间左端点,如果区间长度为1则f[i][j]=1,否则当s[i]!=s[j]时,f[i][j] = max(f[i+1][j],f[i][j-1]),当s[i]==s[j]时,f[i][j] = max(f[i][j],f[i+1][j-1]+2).最后答案为n - f[0][n-1]

【Python程序代码】

f = [[0]*(1010) for _ in range(1010)]
s = input()
n = len(s)
for le in range(1,n+1):i = 0while i+le-1<n:j = i+le-1if le==1:f[i][j]=1else:f[i][j] = max(f[i + 1][j], f[i][j - 1])if s[i] == s[j]:f[i][j] = max(f[i][j], f[i + 1][j - 1] + 2)i += 1
print(n-f[0][n-1])

试题四:能量项链

【题目描述】

        在 Mars 星球上,每个 Mars 人都随身佩带着一串能量项链,在项链上有 N 颗能量珠。能量珠是一颗有头标记与尾标记的珠子,这些标记对应着某个正整数。并且,对于相邻的两颗珠子,前一颗珠子的尾标记一定等于后一颗珠子的头标记。因为只有这样,通过吸盘(吸盘是 Mars 人吸收能量的一种器官)的作用,这两颗珠子才能聚合成一颗珠子,同时释放出可以被吸盘吸收的能量。如果前一颗能量珠的头标记为 m,尾标记为 r,后一颗能量珠的头标记为 r,尾标记为 n,则聚合后释放的能量为 m×r×n(Mars 单位),新产生的珠子的头标记为 m,尾标记为 n。需要时,Mars 人就用吸盘夹住相邻的两颗珠子,通过聚合得到能量,直到项链上只剩下一颗珠子为止。显然,不同的聚合顺序得到的总能量是不同的,请你设计一个聚合顺序,使一串项链释放出的总能量最大。例如:设 N=4,44 颗珠子的头标记与尾标记依次为 (2,3)(3,5)(5,10)(10,2)。我们用记号 ⊕⊕ 表示两颗珠子的聚合操作,(j⊕k)表示第 j,k 两颗珠子聚合后所释放的能量。则第 4、14、1 两颗珠子聚合后释放的能量为:(4⊕1)=10×2×3=60。这一串项链可以得到最优值的一个聚合顺序所释放的总能量为 ((4⊕1)⊕2)⊕3)=10×2×3+10×3×5+10×5×10=710。

【输入格式】

        输入的第一行是一个正整数 N,表示项链上珠子的个数。

        第二行是 N 个用空格隔开的正整数,所有的数均不超过 1000,第 i 个数为第 i 颗珠子的头标记,当 i<N 时,第 i 颗珠子的尾标记应该等于第 i+1 颗珠子的头标记,第 N 颗珠子的尾标记应该等于第 1 颗珠子的头标记。

        至于珠子的顺序,你可以这样确定:将项链放到桌面上,不要出现交叉,随意指定第一颗珠子,然后按顺时针方向确定其他珠子的顺序。

【输出格式】

        输出只有一行,是一个正整数 E,为一个最优聚合顺序所释放的总能量。

【数据范围】

        4≤N≤100,
        1≤E≤2.1×109

【输入样例】

4
2 3 5 10

【输出样例】

710

【解题思路】

        首先这个这是一个环,如何处理环的首尾相接呢?可以在原数组的末尾在复制一个一样的数组,也就是构建出每一个首尾。最后答案应该为枚举i in [1,n],res = max(res,f[i][i+n])。采用区间DP的方法,先枚举区间长度,然后枚举区间左端点,然后枚举断点k。状态转移方程为:f[ll][r] = max(f[l][r],f[l][k] + f[k][r] + w[l]*w[k]*[r])。

【Python程序代码】

n = int(input())
w = list(map(int,input().split()))
w = [0] + w + w
f = [[0]*(2*n+5) for _ in range(2*n+5)]
for le in range(2,n+2):l = 1while l+le-1<=(n<<1):r = l+le-1if le==2:f[l][r]=0else:for k in range(l+1,r):f[l][r] = max(f[l][r], f[l][k] + f[k][r] + w[l]*w[k]*w[r])l+=1
res = 0
for l in range(1,n+1):res = max(res,f[l][l+n])
print(res)

相关文章:

2024蓝桥杯每日一题(区间DP)

备战2024年蓝桥杯 -- 每日一题 Python大学A组 试题一&#xff1a;游戏 试题二&#xff1a;石子合并 试题三&#xff1a;密码脱落 试题四&#xff1a;能量项链 试题一&#xff1a;游戏 【题目描述】 玩家一和玩家二共同玩一个小游戏。给定一个包含 N 个…...

LeetCode-2952. 需要添加的硬币的最小数量【贪心 数组 排序】

LeetCode-2952. 需要添加的硬币的最小数量【贪心 数组 排序】 题目描述&#xff1a;解题思路一&#xff1a;看提示主要是用贪心和排序。那我们肯定是首先对coins排序。然后依次遍历coins[i]&#xff0c;获取当前可以获取金额范围&#xff0c;和判断是否加入新硬币。判断规则如下…...

新书速递——《可解释AI实战(PyTorch版)》

本书旨在帮助你实施最新的可解释AI技术&#xff0c;以构建公平且可解释的AI系统。可解释AI是当今AI研究中的热门话题&#xff0c;但只有少数资源和指南涵盖了所有重要技术&#xff0c;这些技术对实践者来说非常有价值。本书旨在填补这一空白。 本书读者对象 本书既适合那些有兴…...

国产数据库中统计信息自动更新机制

数据库中统计信息描述的数据库中表和索引的大小数以及数据分布状况&#xff0c;统计信息的准确性对优化器选择执行计划时具有重要的参考意义。本文简要整理了下传统数据库和国产数据库中统计信息的自动更新机制&#xff0c;以加深了解。 1、数据库统计信息介绍 优化器是数据库…...

【C++】入门C++(中)

好的&#xff0c;我们继续&#xff0c;这是 C专栏的第二篇博客&#xff0c;还没读过上一篇博客可以进入我创建的专栏阅读 入门C&#xff08;上&#xff09;再回来哦~ 下面我们要讲的第一个概念就是函数重载 函数重载 1. 函数重载概念 什么是函数重载&#xff1f; 简单来说…...

javaIO

file类 一个File类的对象可以表示一个具体的文件或目录 mkdir 创建单级文件夹 mkdirs 创建多级文件夹 delete 删除一个文件夹时&#xff0c;文件夹里面必须是空的 listfiles 将文件夹的子集放到一个file类型的数组中 输入及输出的概念 输入input 输出output 把jav…...

睿尔曼超轻量仿人机械臂之复合机器人底盘介绍及接口调用

机器人移动平台是一个包含完整成熟的感知、认知和定位导航能力的轮式机器人底盘产品级平台&#xff0c;产品致力于为各行业细分市场的商用轮式服务机器人提供一站式移动机器人解决方案&#xff0c;让合作伙伴专注在核心业务/人机交互的实现。以下是我司产品双臂机器人以及复合升…...

用JSch实现远程传输文件并打包成jar

本文将简单介绍一下 JSch 这个Java的第三方库的一个简单用法&#xff0c;并以此为实例&#xff0c;讲解 IntelliJ 中打包成 jar 包的2种方式。 实现目标 我们的目标是&#xff0c;做出一个jar包&#xff0c;它能够实现类似于 scp 命令的远程传输文件的功能。用法如下&#xf…...

2023年第十四届蓝桥杯大赛软件类省赛C/C++研究生组真题(代码完整题解)

C题-翻转⭐ 标签:贪心 简述:如果 S 中存在子串 101 或者 010,就可以将其分别变为 111 和 000,操作可以无限重复。最少翻转多少次可以把 S 变成和 T 一样。 链接: 翻转 思路:要求步骤最少->S每个位置最多修改一次->从头开始遍历不匹配就翻转->翻转不了就-1 …...

力扣刷题Days28-第二题-11.盛水最多的容器(js)

目录 1&#xff0c;题目 2&#xff0c;代码 3&#xff0c;学习与总结 3.1思路回顾 1&#xff0c;如何遍历 2&#xff0c;算法流程 3.2剖析问题 1&#xff0c;题目 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, h…...

文生图大模型三部曲:DDPM、LDM、SD 详细讲解!

1、引言 跨模态大模型是指能够在不同感官模态(如视觉、语言、音频等)之间进行信息转换的大规模语言模型。当前图文跨模态大模型主要有&#xff1a; 文生图大模型&#xff1a;如 Stable Diffusion系列、DALL-E系列、Imagen等 图文匹配大模型&#xff1a;如CLIP、Chinese CLIP、…...

算法学习——LeetCode力扣动态规划篇10(583. 两个字符串的删除操作、72. 编辑距离、647. 回文子串、516. 最长回文子序列)

算法学习——LeetCode力扣动态规划篇10 583. 两个字符串的删除操作 583. 两个字符串的删除操作 - 力扣&#xff08;LeetCode&#xff09; 描述 给定两个单词 word1 和 word2 &#xff0c;返回使得 word1 和 word2 相同所需的最小步数。 每步 可以删除任意一个字符串中的一个…...

TASKPROMPTER

baseline模型的预训练权重就有1.6G! 多吓人呐&#xff0c;当时我就暂停下载了&#xff0c;不建议复现...

C之易错注意点转义字符,sizeof,scanf,printf

目录 前言 一&#xff1a;转义字符 1.转义字符顾名思义就是转换原来意思的字符 2.常见的转义字符 1.特殊\b 2. 特殊\ddd和\xdd 3.转义字符常错点----计算字符串长度 注意 &#xff1a; 如果出现\890,\921这些的不是属于\ddd类型的&#xff0c;&#xff0c;不是一个字符…...

等级保护测评无补偿因素的高风险安全问题判例(共23项需整改)

层面 控制点 要求项 安全问题 适用范围 充分条件 整改建议简要 安全物理环境 基础设施位置 应保证云计算基础设施位于中国境内 1.云计算基础设施物理位置不当 二级及以上 相关基础设施不在中国境内 云平台相关基础设施在中国境内部署 安全通信网络 网络架构 应…...

JavaScript笔记 09

目录 01 DOM操作事件的体验 02 获取元素对象的五种方式 03 事件中this指向问题 04循环绑定事件 05 DOM节点对象的常用操作 06 点亮盒子的案例 07 节点访问关系 08 设置和获取节点内容的属性 09 以上内容的小总结 01 DOM操作事件的体验 js本身是受事件驱动的脚本语言 什…...

操作教程|在MeterSphere中通过SSH登录服务器的两种方法

MeterSphere开源持续测试平台拥有非常强大的插件集成机制&#xff0c;用户可以通过插件实现平台能力的拓展&#xff0c;借助插件或脚本实现多种功能。在测试过程中&#xff0c;测试人员有时需要通过SSH协议登录至服务器&#xff0c;以获取某些配置文件和日志文件&#xff0c;或…...

Swashbuckle.AspNetCore介绍

使用 ASP.NET Core 构建的 API 的 Swagger 工具。直接从您的路由、控制器和模型生成精美的 API 文档&#xff0c;包括用于探索和测试操作的 UI。 除了 Swagger 2.0 和 OpenAPI 3.0 生成器外&#xff0c;Swashbuckle 还提供了由生成的 Swagger JSON 提供支持的令人敬畏的 swagg…...

【Spring】通过Spring收集自定义注解标识的方法

文章目录 前言1. 声明注解2. 使用 Spring 的工厂拓展3. 收集策略4. 完整的代码后记 前言 需求&#xff1a; 用key找到对应的方法实现。使用注解的形式增量开发。 MyComponent public class Sample1 {MyMethod(key "key1")public String test2() {return "She…...

基于深度学习的图书管理推荐系统(python版)

基于深度学习的图书管理推荐系统 1、效果图 1/1 [] - 0s 270ms/step [13 11 4 19 16 18 8 6 9 0] [0.1780757 0.17474999 0.17390694 0.17207369 0.17157653 0.168248440.1668652 0.16665359 0.16656876 0.16519257] keras_recommended_book_ids深度学习推荐列表 [9137…...

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO&#xff1a;支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题&#xff1a;MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者&#xff1a;Yanyuan Chen, Dexuan Xu, Yu Hu…...

大数据零基础学习day1之环境准备和大数据初步理解

学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 &#xff08;1&#xff09;设置网关 打开VMware虚拟机&#xff0c;点击编辑…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代&#xff0c;智能代理&#xff08;agents&#xff09;不再是孤立的个体&#xff0c;而是能够像一个数字团队一样协作。然而&#xff0c;当前 AI 生态系统的碎片化阻碍了这一愿景的实现&#xff0c;导致了“AI 巴别塔问题”——不同代理之间…...

PL0语法,分析器实现!

简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:

根据万维钢精英日课6的内容&#xff0c;使用AI&#xff08;2025&#xff09;可以参考以下方法&#xff1a; 四个洞见 模型已经比人聪明&#xff1a;以ChatGPT o3为代表的AI非常强大&#xff0c;能运用高级理论解释道理、引用最新学术论文&#xff0c;生成对顶尖科学家都有用的…...

今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存

文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)

Aspose.PDF 限制绕过方案&#xff1a;Java 字节码技术实战分享&#xff08;仅供学习&#xff09; 一、Aspose.PDF 简介二、说明&#xff08;⚠️仅供学习与研究使用&#xff09;三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...

Java求职者面试指南:计算机基础与源码原理深度解析

Java求职者面试指南&#xff1a;计算机基础与源码原理深度解析 第一轮提问&#xff1a;基础概念问题 1. 请解释什么是进程和线程的区别&#xff1f; 面试官&#xff1a;进程是程序的一次执行过程&#xff0c;是系统进行资源分配和调度的基本单位&#xff1b;而线程是进程中的…...