【题目链接】

ybt 1570:【例 2】能量项链
ybt 1843:【06NOIP提高组】能量项链
洛谷 P1063 [NOIP 2006 提高组] 能量项链

【题目考点】

1. 动态规划:区间动规
2. 环形序列

解决方法:破环为链
模板题:洛谷 P1880 [NOI1995] 石子合并

【解题思路】

本题与洛谷 P1880 [NOI1995] 石子合并十分类似,可以先做上题,而后做本题。
环形序列上的问题,首先进行破环为链,将长为n的输入a序列变为长为 2 n 2n 2n的a序列。其中 a i + n = a i , 1 ≤ i ≤ n a_{i+n}=a_i,1\le i \le n ai+n=ai,1in
原环形序列为由n个珠子构成的环形序列。破环为链后得到的是由 2 n − 1 2n-1 2n1个珠子构成的线性序列。该线性序列为一个假想的 b b b序列, b b b序列的每个元素为一个珠子,第i颗珠子 d i d_i di的头标记为 a i a_i ai,尾标记为 a i + 1 a_{i+1} ai+1。最后第 2 n − 1 2n-1 2n1个珠子 b 2 n − 1 b_{2n-1} b2n1的头标记为 a 2 n − 1 a_{2n-1} a2n1,尾标记为 a 2 n a_{2n} a2n

1. 状态定义
  • 阶段:第i个珠子到第j个珠子,即b序列区间 [ i , j ] [i,j] [i,j]
  • 决策:合并哪两个珠子
  • 策略:合并的方案
  • 策略集合:b序列区间 [ i , j ] [i,j] [i,j]的所有合并方案
  • 条件:获得能量最大
  • 统计量:能量

状态定义: d p i , j dp_{i,j} dpi,j:b序列区间 [ i , j ] [i,j] [i,j]的所有合并方案中,获得能量最大的方案所获得的能量。
初始状态:1颗珠子无法合并,获得能量为0。因此 d p i , i = 0 dp_{i,i}=0 dpi,i=0

2. 状态转移方程
  • 策略集合:b序列区间 [ i , j ] [i,j] [i,j]的所有合并方案
    根据最后一次将哪两个珠子合并,来分割策略集合。

设存在分割点 k k k,将区间 [ i , j ] [i,j] [i,j]分割为区间 [ i , k ] [i,k] [i,k]与区间 [ k + 1 , j ] [k+1,j] [k+1,j]。自然 i ≤ k < j i\le k < j ik<j
要想求 d p i , j dp_{i,j} dpi,j

  • 先将b序列区间 [ i , k ] [i,k] [i,k]合并为一个珠子,获得能量 d p i , k dp_{i,k} dpi,k。得到珠子的头标记为 b i b_i bi的头标记 a i a_i ai,尾标记为 b k b_k bk的尾标记 a k + 1 a_{k+1} ak+1
  • 再将b序列区间 [ k + 1 , j ] [k+1,j] [k+1,j]合并为一个珠子,获得能量 d p k + 1 , j dp_{k+1,j} dpk+1,j。得到珠子的头标记为 b k + 1 b_{k+1} bk+1的头标记 a k + 1 a_{k+1} ak+1,尾标记为 b j b_j bj的尾标记 a j + 1 a_{j+1} aj+1
  • 而后再将这两个珠子合并,获得能量 a i ⋅ a k + 1 ⋅ a j + 1 a_i\cdot a_{k+1}\cdot a_{j+1} aiak+1aj+1

求出 d p i , j = d p i , k + d p k + 1 , j + a i ⋅ a k + 1 ⋅ a j + 1 dp_{i,j} = dp_{i,k}+dp_{k+1,j}+a_i\cdot a_{k+1}\cdot a_{j+1} dpi,j=dpi,k+dpk+1,j+aiak+1aj+1
枚举分割点 k k k的所有可能情况,求出每种情况下状态的最大值。
状态转移方程为:
d p i , j = max ⁡ { d p i , k + d p k + 1 , j + a i ⋅ a k + 1 ⋅ a j + 1 } , i ≤ k < j dp_{i,j} = \max\{dp_{i,k}+dp_{k+1,j}+a_i\cdot a_{k+1}\cdot a_{j+1}\}, i\le k < j dpi,j=max{dpi,k+dpk+1,j+aiak+1aj+1},ik<j

3. 具体实现

由于求满足条件的最大值,dp数组初值应该为很小的值。由于所有可能的状态值都是非负整数,因此dp数组初值可以为0。
对于长为1的区间的状态,1个珠子无法合并获得能量,因此 d p i , i = 0 dp_{i,i}=0 dpi,i=0
外层循环为区间长度len,len最小为2,最大为n。
内层循环为区间左端点i,i最小为1。由于破环为链后 b b b序列共有 2 n − 1 2n-1 2n1个元素,i最大时,区间右端点 i + l e n − 1 i+len-1 i+len1 2 n − 1 2n-1 2n1,因此 i + l e n − 1 < 2 n i+len-1<2n i+len1<2n
取区间右端点 j = i + l e n − 1 j=i+len-1 j=i+len1,在 i ≤ k < j i\le k <j ik<j范围内枚举分割点 k k k,执行状态转移方程。
最后,枚举 b b b序列上所有长为 n n n的区间,包括 [ 1 , n ] , [ 2 , n + 1 ] , . . . , [ n − 1 , 2 n − 2 ] , [ n , 2 n − 1 ] [1,n], [2, n+1], ..., [n-1, 2n-2], [n, 2n-1] [1,n],[2,n+1],...,[n1,2n2],[n,2n1],即 [ i , i + n − 1 ] , 1 ≤ i ≤ n [i, i+n-1], 1\le i \le n [i,i+n1],1in。求出每个区间的状态值 d p i , i + n − 1 dp_{i, i+n-1} dpi,i+n1的最大值,即为合并环形序列上珠子能获得的最大能量。

【题解代码】

解法1:区间动规 破环为链
#include<bits/stdc++.h>
using namespace std;
#define N 205
int a[N], n, ans, dp[N][N];//dp[i][j]:第i珠子到第j珠子有聚合方案中,释放的能量最大的方案的能量   
int main()
{cin >> n;for(int i = 1; i <= n; ++i){cin >> a[i];a[i+n] = a[i];}for(int len = 2; len <= n; ++len)//由于都是正整数,求最大值。dp初值为很小的值,可以为0。dp[i][i] = 0 {for(int i = 1; i+len-1 < 2*n; ++i){int j = i+len-1;for(int k = i; k < j; ++k)dp[i][j] = max(dp[i][j], dp[i][k]+dp[k+1][j]+a[i]*a[k+1]*a[j+1]); }}for(int i = 1; i <= n; ++i)ans = max(ans, dp[i][i+n-1]);cout << ans;return 0;
}
``

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

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

相关文章

旅游微信小程序制作指南

想创建旅游微信小程序吗&#xff1f;知道旅游业企业怎么打造自己的小程序吗&#xff1f;这里有零基础小白也能学会的教程&#xff0c;教你快速制作旅游类微信小程序&#xff01; 旅游行业能不能开发微信小程序呢&#xff1f;答案是肯定的。微信小程序对旅游企业来说可是个宝&am…

Vue3+Vite中lodash-es安装与使用指南

在 Vue 3 Vite 项目中安装和使用 lodash-es 的详细指南如下&#xff1a; 一、为什么选择 lodash-es&#xff1f; ES 模块支持&#xff1a;lodash-es 以原生 ES 模块格式发布&#xff0c;支持现代构建工具的 Tree Shaking 按需加载&#xff1a;只引入需要的函数&#xff0c;显…

法律模型选型

当然可以&#xff0c;以下是关于法律法规相关模型的技术选型调研建议&#xff0c;适合算法实习生从0入手&#xff0c;并能交付有深度的调研报告&#xff1a; 一、调研背景与目标 目标&#xff1a;调研用于处理法律法规类任务的大模型与技术方案&#xff0c;明确适合本团队的模…

软件工程专业的本科生应该具备哪些技能

软件工程专业的本科生需要具备扎实的技术基础、良好的开发流程认知和一定的软技能&#xff0c;以适应软件开发行业的需求。以下从技术技能、开发流程与工具、软技能、实践能力等维度整理核心技能清单&#xff0c;供参考&#xff1a; 一、核心技术技能 1. 编程语言 - 必学基础语…

[Java 基础]类,面向对象的蓝图

首先需要区分类和对象都是啥&#xff1f; 类&#xff1a;类是一个模板&#xff0c;它描述一类对象的行为和状态&#xff0c;类这个概念更像是下定义&#xff0c;更像是模板&#xff08;橡皮泥膜具&#xff09;。 对象&#xff1a;对象&#xff08;不是女朋友&#xff09;是类…

selenium-自动更新谷歌浏览器驱动

1、简介 selenium最初是一个自动化测试工具&#xff0c;而爬虫中使用它主要是为了解决requests无法直接执行JavaScript代码的问题&#xff0c;因为有些网页数据是通过JavaScript动态加载的。selenium本质是通过驱动浏览器&#xff0c;完全模拟浏览器的操作&#xff0c;比如输入…

java从azure中读取用户信息

以下是用 Java 从 Azure AD 获取用户信息的完整实现方案&#xff0c;使用 Spring Boot 框架和 Microsoft 身份验证库 (MSAL)&#xff1a; 1. 添加 Maven 依赖 <dependencies> <!-- Spring Boot Web --> <dependency> <groupId>org.…

C# 数据库访问与ORM框架全面指南:从ADO.NET到Entity Framework Core

在现代应用开发中&#xff0c;数据持久化是核心需求之一。作为.NET生态系统中的主力语言&#xff0c;C#提供了丰富多样的数据库访问技术和工具。本文将全面探讨C#中的数据库访问方式&#xff0c;重点介绍三种主流ORM&#xff08;对象关系映射&#xff09;框架&#xff1a;Entit…

day19 leetcode-hot100-37(二叉树2)

104. 二叉树的最大深度 - 力扣&#xff08;LeetCode&#xff09; 1.深度优先遍历&#xff08;递归&#xff09;ps:不好理解&#xff0c;所以我一般不喜欢用递归 思路 典型算法&#xff0c;用递归求出高度&#xff0c;每次都是深度优先。 具体算法 /*** Definition for a bi…

【LLMs篇】13:LLaDA—大型语言扩散模型

栏目内容论文标题大型语言扩散模型 (Large Language Diffusion Models)核心思想提出LLaDA&#xff0c;一种基于扩散模型的LLM&#xff0c;通过前向掩码和反向预测过程建模语言分布&#xff0c;挑战自回归模型&#xff08;ARM&#xff09;在LLM领域的主导地位&#xff0c;并展示…

Deepfashion2 数据集使用笔记

目录 数据类别: 筛选类别数据: 验证筛选前2个类别: Deepfashion2 的解压码 数据类别: 类别含义: Class idx类别名称英文名称0短上衣short sleeve top1长上衣long sleeve top2短外套short sleeve outwear3长外套long sleeve outwear4裙子skirt5裤子trousers6连衣裙dre…

Java并发编程哲学系列汇总

文章目录 并发编程基础并发编程进阶并发编程实践 并发编程基础 Java并发编程基础小结 Java线程池知识点小结 详解JUC包下各种锁的使用 并发编程利器Java CAS原子类全解 深入理解Java中的final关键字 Java并发容器深入解析&#xff1a;HashMap与ArrayList线程安全问题及解…

git 之 stash

一、git stash&#xff1a;临时保存工作区修改 作用 将当前工作目录和暂存区的未提交修改保存到栈中&#xff0c;并恢复工作区到上一次提交的干净状态。 适用场景&#xff1a; 临时切换分支修复紧急 Bug拉取远程代码前清理工作区保存实验性代码避免生成无效提交 常用命令&am…

vxe-grid 双击行,打开expand的内容

1、官网api Vxe Table v4.6&#xff08;根据版本&#xff09; 要调用这个事件&#xff0c;双击单元格&#xff0c;我们打开type"expand"的内容 2、打开的事件toggleRowExpand 3、事件的说明 这个方法&#xff0c;会自动判断当前展开的状态&#xff0c;然后去触发相…

Java Stream 高级实战:并行流、自定义收集器与性能优化

一、并行流深度实战&#xff1a;大规模数据处理的性能突破 1.1 并行流的核心应用场景 在电商用户行为分析场景中&#xff0c;需要对百万级用户日志数据进行实时统计。例如&#xff0c;计算某时段内活跃用户数&#xff08;访问次数≥3次的用户&#xff09;&#xff0c;传统循环…

计算机系统结构-第5章-监听式协议

监听式协议******&#xff1a; 思想: 每个Cache除了包含物理存储器中块的数据拷贝之外&#xff0c;也保存着各个块的共享状态信息。 Cache通常连在共享存储器的总线上&#xff0c;当某个Cache需要访问存储器时&#xff0c;它会把请求放到总线上广播出去&#xff0c;其他各个C…

(c++)string的模拟实现

目录 1.构造函数 2.析构函数 3.扩容 1.reserve(扩容不初始化) 2.resize(扩容加初始化) 4.push_back 5.append 6. 运算符重载 1.一个字符 2.一个字符串 7 []运算符重载 8.find 1.找一个字符 2.找一个字符串 9.insert 1.插入一个字符 2.插入一个字符串 9.erase 10…

学习笔记(24): 机器学习之数据预处理Pandas和转换成张量格式[2]

学习笔记(24): 机器学习之数据预处理Pandas和转换成张量格式[2] 学习机器学习&#xff0c;需要学习如何预处理原始数据&#xff0c;这里用到pandas&#xff0c;将原始数据转换为张量格式的数据。 学习笔记(23): 机器学习之数据预处理Pandas和转换成张量格式[1]-CSDN博客 下面…

LeetCode 2297. 跳跃游戏 VIII(中等)

题目描述 给定一个长度为 n 的下标从 0 开始的整数数组 nums。初始位置为下标 0。当 i < j 时&#xff0c;你可以从下标 i 跳转到下标 j: 对于在 i < k < j 范围内的所有下标 k 有 nums[i] < nums[j] 和 nums[k] < nums[i] , 或者对于在 i < k < j 范围…

【前端】缓存相关

本知识页参考&#xff1a;https://zhuanlan.zhihu.com/p/586060532 1. 概述 1.1 应用场景 静态资源 场景&#xff1a;图片、CSS、JS 文件等静态资源实现&#xff1a;使用 HTTP 缓存控制头&#xff0c;或者利用 CDN 进行边缘缓存 数据缓存 场景&#xff1a;请求的返回结果实现…