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

区间动态规划——【# P3146 [USACO16OPEN] 248 G】

P3146 [USACO16OPEN] 248 G

题目描述

贝西喜欢在手机上下载游戏来玩,尽管她确实觉得对于自己巨大的蹄子来说,小小的触摸屏用起来相当笨拙。

她对当前正在玩的这个游戏特别感兴趣。游戏开始时给定一个包含NNN个正整数的序列(2≤N≤2482 \leq N \leq 2482N248),每个数的范围在1…401 \ldots 40140之间。在一次操作中,贝西可以选择两个相邻且相等的数,将它们替换为一个比原数大111的数(例如,她可以将两个相邻的7替换为一个8)。游戏的目标是最大化最终序列中的最大数值。请帮助贝西获得尽可能高的分数!

输入格式

第一行输入包含NNN,接下来的NNN行给出游戏开始时序列的NNN个数字。

输出格式

请输出贝西能生成的最大整数。

输入输出样例 #1

输入 #1

4 1 1 1 2

输出 #1

3

说明/提示

在示例中,贝西首先合并第二个和第三个1,得到序列1 2 2,然后将两个2合并为3。注意,合并前两个1并不是最优策略。

暴力

拿到当前数组,先扫一遍,更新当前数组里的最大值;
从头到尾遍历,只要发现 相邻两个数相等:
把这两个数合并成一个(数值 + 1),删掉后一个,生成新数组;
带着这个新数组,递归继续往下搜;
每条分支走到不能再合并为止,全部分支搜完,全局最大就是结果。

#include<bits/stdc++.h>usingnamespacestd;constintN=250;intn,ans;voidgo(vector<int>v){intbig=*max_element(v.begin(),v.end());ans=max(ans,big);for(inti=0;i<v.size()-1;i++){if(v[i]==v[i+1]){vector<int>z;for(intj=0;j<v.size();j++){if(i==j)z.push_back(v[j]+1);elseif(i+1==j)continue;elsez.push_back(v[j]);}go(z);}}}intmain(){//freopen("data.cpp","r",stdin);cin>>n;vector<int>v(n);for(inti=0;i<n;i++)cin>>v[i];go(v);cout<<ans;return0;}

无脑穷举所有合并顺序,重复计算多,指数级慢;
每遇到一对可合并的相邻数,就分出一条新递归分支;最坏情况(全是相同数)每步都有多个分叉,分支数量层层翻倍,是O(2n) 指数级。

区间动态规划

状态:dp[l][r],数组中第 l 到 r 这一段区间,如果能完整合并成一个数,就存这个值;不能合并就存0。
按区间长度从小到大枚举;
对每个区间 [l, r],中间随便切一刀分成左右两段 [l,x] 和 [x+1,r];能合就合,左边值 + 1,存入 dp[l][r],同时更新全局最大值 ans。

#include<bits/stdc++.h>usingnamespacestd;constintN=300;intn,// 数组长度v[N],// 存储原始输入的数字数组dp[N][N],// 区间 [l, r] 完全合并成 一个数 的值,等于0说明该区间无法合并成一个数ans;// 全局能合并出的最大数字intmain(){cin>>n;for(inti=1;i<=n;i++){cin>>v[i];dp[i][i]=v[i];// 单个数字本身就是一个数,无法再合并ans=max(ans,dp[i][i]);//原始数组的最大值}// 区间 DP 核心:按区间长度从小到大枚举(短区间→长区间)// 因为长区间的合并依赖于内部短区间的合并结果for(intlen=2;len<=n;len++)// 已知len=1时的最大值,从2开始for(intl=1;l+len-1<=n;l++){//左边界(l+len-1右边界)intr=l+len-1;// r:根据长度计算出的区间右边界dp[l][r]=0;//要么不能合并=0,否则就是下面的事for(intx=l;x<r;x++){//状态转移:枚举区间内的分割点 x,把 [l, r] 分成 [l, x] 和 [x+1, r]if(dp[l][x]!=0&&dp[l][x]==dp[x+1][r]){// 转移条件:相等dp[l][r]=dp[l][x]+1;//整个大区间可以合并成 【相等值 + 1】ans=max(ans,dp[l][r]);//更新全局答案}}}cout<<ans;return0;}

三层循环:枚举区间长度、枚举左端点、枚举分割点复杂度:O (n³)

http://www.jsqmd.com/news/780304/

相关文章:

  • AI API桥接器设计:实现Claude与DeepSeek协议转换的工程实践
  • OpenClaw配置开发提效:VS Code扩展的智能验证与工作流实践
  • 百元成本训练GPT-2:nanochat极简框架与缩放定律实践
  • 四足机器人滑行控制:贝叶斯优化与强化学习协同设计
  • SKILL推荐实战 - 80%测试覆盖率不是梦,而是标准工作流
  • 2026年4月品质好的中餐食材供应工厂推荐,黄牛肉/糊辣乌鸡/嫩肉片/猪肉丸/火锅食材供应,中餐食材供应品牌怎么选择 - 品牌推荐师
  • 2026 最新版全网最细网络安全学习路线,从零基础小白逆袭实战专家全覆盖
  • 一文读懂电阻所有知识1
  • XNBCLI:3步搞定星露谷物语XNB文件解包打包的完整指南
  • 百度网盘提取码智能获取:如何用3秒钟解决你90%的资源下载难题
  • docker安装pgvector
  • ARM DynamIQ架构ROM表机制与多核电源管理解析
  • 2026年推荐铁电测试仪售后无忧公司 - 行业平台推荐
  • 基于Tauri的AI技能统一管理器:解决多平台技能碎片化难题
  • 最懂开发者的云平台:谷歌云
  • 如何高效管理多游戏模型:XXMI-Launcher终极解决方案指南
  • 可视化图表三大家族:静态动态交互全解析,Python 可视化图表到底有哪些?
  • 政务数字化下半场:大模型如何破解 “数据沉睡” 难题
  • 浏览器资源嗅探技术:从碎片化视频流到完整内容获取的解决方案
  • 如何在 k8s 用 elastic-agent 部署避免日志体积过大?
  • 2026年比较好的螺旋地桩主流厂家对比评测 - 行业平台推荐
  • CODMAS框架:多智能体协作的RTL优化新方法
  • Switch终极自定义指南:大气层1.7.1稳定版快速上手
  • YY/T 0291-2016 医用 X 射线设备环境要求及试验方法 全解析
  • 工程数据长期保存:数字脆弱性与物理副本的混合策略
  • 抖音视频批量下载终极指南:Python自动化解决方案完整解析
  • 粒子群优化算法(PSO)原理与Python高级实现
  • 去中心化LLM服务架构:挑战、设计与实践
  • 智慧树自动刷课插件:3步实现高效学习自动化,节省90%学习时间
  • 让机器人边干活边学习:LWD框架到底解决了什么问题,又留下了什么取舍?