题解:P12330 [蓝桥杯 2023 省 Java B] 合并石子

news/2025/11/15 11:14:39/文章来源:https://www.cnblogs.com/linruicong/p/19224683

这篇题解是来给楼上大佬 MoonCake2011 的题解做补充的。很巧,我的思路和大佬的思路非常相似。这篇题解相对于大佬的题解或许讲的更加详细,对初学者更友好一些,所以管理大大求过

题目分析

很显然,做过弱化版的都知道,肯定就是用区间 DP 了。

什么是区间动态规划?

会的大佬请略过。

其实区间动态规划的含义很好理解,就是将普通的动态规划策略放到区间里而已,以此解决区间的一些最优解问题。解决的方式大体是相同的,都是通过一些子问题的最优解转移到大问题的最优解以此解决问题。放到区间动态规划里无非就是多个子区间对大区间的最优解的更新。

区间动态规划一般会有两个维度,分别表示一个区间的左端点和右端点。同时,我们使用循环来枚举区间,然后根据题意进行转移。

在必要的时候,我们还可以增加一些维度来表示更加复杂的状态。

接下来可以通过这道题的弱化版来给大家讲解最简单的区间动态规划。

题目讲解

我们可以发现,这道题目就是去掉了颜色的区分而已。我们可以设 \(f_{i,j}\) 为合并区间 \([i,j]\) 所需的最小花销。根据题意,我们就可以设立状态转移方程。

由于题目的意思是两个区间合并,那么我们可以枚举一个分割点 \(k\) 以此把目标区间分成两部分。枚举不同的 \(k\) 可以得到不同的合并花销。这些不同的方案中的最小值就是这个区间的最优合并花销了。

显然,公式为:

\[f_{i,j}=\min(f_{i,j},f_{l,k}+f_{k+1,j}+s_{i,j}) \]

代码实现

#include<bits/stdc++.h>
using namespace std;
int n,a[605],s[305][305],r,f[305][305]; 
int main()
{scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d",&a[i]);a[n+i]=a[i];}for(int i=1;i<=n;i++){s[i][i]=a[i];for(int j=i+1;j<=n;j++) s[i][j]=s[i][j-1]+a[j];//预处理区间数值和}for(int len=2;len<=n+1;len++){for(int l=1;l+len-1<=n;l++)//枚举区间{r=l+len-1;f[l][r]=0x7f7f7f7f;for(int k=l;k<r;k++) f[l][r]=min(f[l][r],f[l][k]+f[k+1][r]+s[l][r]);//枚举分割点并且更新最优解}}printf("%d",f[1][n]);return 0;
}

本题题解

我们设 \({f_1}_{l,r,k}\) 为区间 \([l,r]\),颜色为 \(k\) 的合并最小开销,\(s_l\)\(s_r\) 分别为序列的前 \(l\) 个数的和以及序列的前 \(r\) 个数的和,\(pos\) 为枚举的分割点(\(l \le pos \le r-1\))。易得方程:

\[{f_1}_{l,r,0}=\min({f_1}_{l,r,0},{f_1}_{l,pos,2}+{f_1}_{pos+1,r,2}+s_r-s_{l-1}) \\ {f_1}_{l,r,1}=\min({f_1}_{l,r,1},{f_1}_{l,pos,0}+{f_1}_{pos+1,r,0}+s_r-s_{l-1}) \\ {f_1}_{l,r,2}=\min({f_1}_{l,r,2},{f_1}_{l,pos,1}+{f_1}_{pos+1,r,1}+s_r-s_{l-1}) \\ \]

接下来,我们再定义一个动态规划数组 \(f2\),这个数组用于答案的计算。

定义 \(f2_{i,j}\) 为将前 \(i\) 个石堆合并成 \(j\) 个石堆的最小花销,\(k\) 为枚举的分割点(\(0 \le k \le i-1\))。易得方程:

\[f2_{i,j}=\min(f2_{i,j},f2_{k,{j-1}}+\min(f1_{{k+1},i,0},\min(f1_{{k+1},i,1},f1_{{k+1},i,2}))) \]

代码实现

#include<bits/stdc++.h>
using namespace std;
int n,t[305],c[305],s[305],f1[305][305][5],f2[305][305],r;
int main()
{scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d",&t[i]);s[i]=s[i-1]+t[i];//计算前缀和}for(int i=1;i<=n;i++) scanf("%d",&c[i]);memset(f1,0x3f,sizeof f1);//初始化为极大值memset(f2,0x3f,sizeof f2);for(int i=1;i<=n;i++) f1[i][i][c[i]]=0;for(int len=2;len<=n;len++){for(int l=1;l+len-1<=n;l++){r=l+len-1;for(int k=l;k<r;k++)//参照上面的方程{f1[l][r][0]=min(f1[l][r][0],f1[l][k][2]+f1[k+1][r][2]+s[r]-s[l-1]);f1[l][r][1]=min(f1[l][r][1],f1[l][k][0]+f1[k+1][r][0]+s[r]-s[l-1]);f1[l][r][2]=min(f1[l][r][2],f1[l][k][1]+f1[k+1][r][1]+s[r]-s[l-1]);}}}f2[0][0]=0;//初始化for(int i=1;i<=n;i++){for(int j=1;j<=i;j++){for(int k=0;k<i;k++){int minn=min(f1[k+1][i][0],min(f1[k+1][i][1],f1[k+1][i][2]));f2[i][j]=min(f2[i][j],f2[k][j-1]+minn);//求出答案}}}for(int i=1;i<=n;i++)//枚举可能的答案{if(f2[n][i]<1e9)//假如这个答案符合标准,则这个答案一定是最优的{printf("%d %d",i,f2[n][i]);//输出答案return 0;}}return 0;
}

考虑到这个是 Java 的题目,但是蒟蒻根本不会 Java。于是我让 DeepSeek 帮我生成了一篇 Java 代码,供学习 Java 的同学参考。

import java.util.Arrays;
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int n = scanner.nextInt();int[] t = new int[n + 1];int[] c = new int[n + 1];int[] s = new int[n + 1];// 读取石子数目并计算前缀和for (int i = 1; i <= n; i++) {t[i] = scanner.nextInt();s[i] = s[i - 1] + t[i];}// 读取石子颜色for (int i = 1; i <= n; i++) {c[i] = scanner.nextInt();}// 初始化三维DP数组 f1[l][r][k]int[][][] f1 = new int[n + 1][n + 1][3];// 初始化为极大值for (int i = 0; i <= n; i++) {for (int j = 0; j <= n; j++) {Arrays.fill(f1[i][j], Integer.MAX_VALUE / 2); // 防止溢出}}// 初始化二维DP数组 f2[i][j]int[][] f2 = new int[n + 1][n + 1];for (int i = 0; i <= n; i++) {Arrays.fill(f2[i], Integer.MAX_VALUE / 2);}// 初始化单堆石子for (int i = 1; i <= n; i++) {f1[i][i][c[i]] = 0;}// 区间DP计算 f1for (int len = 2; len <= n; len++) {for (int l = 1; l + len - 1 <= n; l++) {int r = l + len - 1;for (int k = l; k < r; k++) {// 颜色转移规则:0+0→1, 1+1→2, 2+2→0f1[l][r][0] = Math.min(f1[l][r][0], f1[l][k][2] + f1[k + 1][r][2] + s[r] - s[l - 1]);f1[l][r][1] = Math.min(f1[l][r][1], f1[l][k][0] + f1[k + 1][r][0] + s[r] - s[l - 1]);f1[l][r][2] = Math.min(f1[l][r][2], f1[l][k][1] + f1[k + 1][r][1] + s[r] - s[l - 1]);}}}// 初始化f2f2[0][0] = 0;// 计算f2:将前i堆合并成j堆的最小花费for (int i = 1; i <= n; i++) {for (int j = 1; j <= i; j++) {for (int k = 0; k < i; k++) {int minColor = Math.min(f1[k + 1][i][0], Math.min(f1[k + 1][i][1], f1[k + 1][i][2]));f2[i][j] = Math.min(f2[i][j], f2[k][j - 1] + minColor);}}}// 查找最小堆数和对应的最小花费for (int i = 1; i <= n; i++) {if (f2[n][i] < 1e9) {System.out.println(i + " " + f2[n][i]);return;}}}
}

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

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

相关文章

2025年知名的覆膜吨袋厂家最新TOP实力排行

2025年知名的覆膜吨袋厂家最新TOP实力排行行业背景与市场趋势覆膜吨袋作为现代工业包装的重要组成部分,近年来随着全球贸易的持续增长和物流行业的快速发展,市场需求呈现稳定上升态势。据中国包装联合会最新数据显示…

2025年评价高的水泥排水沟厂家推荐及选购参考榜

2025年评价高的水泥排水沟厂家推荐及选购参考榜 行业背景与市场趋势 随着城市化进程加快,基础设施建设对排水系统的要求日益提高。水泥排水沟作为市政工程、建筑项目、交通设施等领域的重要配套产品,其市场需求持续…

2025年评价高的防排烟风管包裹防火板最新TOP厂家排名

2025年评价高的防排烟风管包裹防火板最新TOP厂家排名行业背景与市场趋势随着建筑安全法规的日益严格和消防要求的不断提高,防排烟风管作为建筑消防系统中的关键组成部分,其市场需求持续增长。据中国消防协会2024年发…

2025年质量好的不锈钢大单槽用户口碑最好的厂家榜

2025年质量好的不锈钢大单槽用户口碑最好的厂家榜行业背景与市场趋势随着现代家居生活品质的不断提升,厨房作为家庭生活的核心区域,其功能性、美观性和耐用性越来越受到消费者的重视。不锈钢大单槽作为厨房水槽的主流…

2025年热门的石材切割片厂家最新TOP排行榜

2025年热门的石材切割片厂家最新TOP排行榜行业背景与市场趋势石材加工行业作为建筑装饰、基础设施建设的重要支撑产业,近年来随着全球建筑业的持续发展而稳步增长。根据《2024-2029年全球石材切割工具市场分析与预测报…

2025年11月载冷剂厂家评测榜:五强资质与服务对比

入冬前夕,冷链、数据中心、新能源电池等温控系统进入高负荷验证期,载冷剂一旦选型失误,轻则能耗飙升,重则设备腐蚀停产。多数用户第一次接触专业载冷剂,常被“冰点、比热、粘度、金属腐蚀率”一串指标绕晕,又担心…

2025年帮我推荐几家哈尔滨刑事律师事务所信赖口碑榜

2025年哈尔滨刑事律师事务所信赖口碑榜:专业推荐与采购指南 行业背景与市场趋势 近年来,随着法治建设的深入推进,刑事法律服务需求持续增长。根据黑龙江省律师协会2024年发布的《法律服务市场发展报告》,哈尔滨市…

2025年11月北京全屋定制厂家评测榜:鲸准家居领衔五强对比

站在2025年11月的时间点,北京准备装修的消费者普遍面临“设计落地难、板材真假难辨、交付周期长”三大痛点。一方面,精装房交付比例已超85%,个性化收纳需求倒逼全屋定制渗透率攀升;另一方面,行业仍呈“大行业、小…

2025年比较好的纳米硅防火玻璃厂家推荐及采购参考

2025年比较好的纳米硅防火玻璃厂家推荐及采购参考行业背景与市场趋势随着建筑安全标准的不断提高和城市化进程的加速推进,防火玻璃作为建筑安全防护的重要组成部分,市场需求呈现稳定增长态势。根据中国建筑玻璃与工业…

自适应bitset

在 CF1856E2 PermuTree (hard version) 一题中,有一种解法是使用了bitset

2025年11月北京全屋定制厂家推荐榜:鲸准家居领衔五家对比排行

把精装房变成真正好住的家,是不少北京业主在2025年秋冬最迫切的任务。二次装修时间紧、预算有限,还要兼顾环保、风格统一和售后,于是“全屋定制”成为主流选择。市住建委数据显示,2025年前三季度北京住宅定制家具合…

2025年合肥活动策划公司权威推荐榜单:公司团建活动策划/年会策划/演出活动策划服务公司精选

🏆 TOP1 安徽俏佳文化传媒有限公司 推荐指数:★★★★★ 联系人:项经理 联系电话:13739299455 公司实力概览 安徽俏佳文化传媒有限公司成立于2016年,是一家集活动策划、设计、执行为一体的综合性传媒公司。公司注…

Linux正常访问github

Linux正常访问githubhttps://tool.chinaz.com/dns/github.com搜索github.com,选择TTL最小的站点,增加到/etc/hosts中。原来现在

2025年可靠的阳光板批发厂家权威推荐榜单:好的阳光板/不错的阳光板/诚信的阳光板源头厂家精选

在绿色建筑需求持续增长的背景下,阳光板市场正迎来新一轮产业升级。全球聚碳酸酯板材市场预计到2029年将达到50.21亿美元,年复合增长率约为4.5%,中国市场在其中占据重要份额。 阳光板作为工业厂房、农业温室、市政景…

1v1直播源码,css 实现直角三角形 - 云豹科技

1v1直播源码,css 实现直角三角形主流浏览器基本都支持 <div class="triangle"></div>.triangle{height: 200px;width: 200px;background-image: linear-gradient(to bottom right,red 50%, tra…

js中函数的导入导出

js中函数的导入导出js中的函数导入导出,是近几年才有官方标准的,即ES6标准。 以前的民间规范CommonJS,这里不做讨论。推荐使用官方标准。背景 设想有这么个页面结构: 一个页面h1.html要使用五项业务功能,分别写在…

2025 最新杭州翻译品牌推荐:涵盖多场景专业翻译服务的优质品牌榜单,杭州法律翻译/杭州移民翻译/杭州签证翻译/杭州专业翻译专业公司推荐

在全球化商务合作持续深化的背景下,商事文件与各类证件翻译的精准性、规范性直接影响跨境事务推进效率。然而当前市场存在资质参差不齐、术语翻译偏差、格式不达标等问题,亟需权威指引。本次榜单由国际译联(FIT)与…

一对一视频app开发,基于Redis+Lua实现分布式限流 - 云豹科技

一对一视频app开发,基于Redis+Lua实现分布式限流一、新建一个Mavne项目,取名为rate_limiter,并引入Lombok和guava的依赖。<dependency><groupId>org.projectlombok</groupId><artifactId>l…

Nginx配置proxy转发其他域名502 - Commissar

Nginx配置:location ~* ^/(.*-bucket)/(.*)$ {proxy_ssl_session_reuse off;proxy_set_header Host a.test.com;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_…

2025年高温抗氧化试验炉制造企业权威推荐榜单:回转抗渣炉/中温试验炉/全自动重烧试验炉设备源头厂家精选

高温抗氧化试验炉作为材料科学研究与质量控制的关键设备,其市场需求正随着新材料研发和材料性能要求的提升而持续增长。本文将基于详实的行业信息,为您推荐2025年度在高温抗氧化试验炉领域表现卓越的Top 3制造厂,通…