石子合并(区间dp)-java

news2024/11/24 16:04:39

石子合并问题是经典的区间dp问题,我们需要枚举中间端点k的情况从而来推出dp数组的值。

文章目录

前言

一、石子合并问题

二、算法思路

1.问题思路

2.状态递推公式

二、代码如下

代码如下(示例):

2.读入数据

3.代码运行结果如下:

总结


前言

石子合并问题是经典的区间dp问题,我们需要枚举中间端点k的情况从而来推出dp数组的值。


提示:以下是本篇文章正文内容,下面案例可供参考

一、石子合并问题

设有 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、3堆,则代价为 7,得到 4 7,最后一次合并代价为 11,总代价为 4+7+11=22。

问题是:找出一种合理的方法,使总的代价最小,输出最小代价。

二、算法思路

1.问题思路

我们引入二维数组dp,dp[i][j]表示的含义是从第i堆,合并到第j堆所需要的最小代价数。

 图1.1思路模拟

 我们可以通过枚举区间长度len,从1枚举n,当然区间长度为1的时候,说明只有一堆石子,就不要合并,代价为0。

然后我们在从1开始枚举左区间的起始端点i,i的值从1枚举到n。我们知道区间长度len,知道左端点i,那么我们就可以得到区间的右端点j=i+len-1。

此时我们再枚举中间端点k,k的值的话从i枚举到j-1,因为我们最后用k将区间分成两堆,分别是i到k堆和k+1到j堆,那么我们k的取值就是从i到j-1。

那么dp[i][j]的值就是从第i堆到第k堆的最小代价数加上第k+1堆到第j堆的最小代价数再加上最后两堆的代价数,我们通过观察可以发现最后两堆的合并一定是第i堆到k堆的连续合并和后面从第k+1堆到第j堆的连续合并之和,那么最后一次就相当于求区间和,我们可以通过前缀和数组的方法来进行处理。

2.状态递推公式

当i=j时,即就一堆:

dp[i][j] = 0

当 枚举中间端点k时:

dp[i][j] = min(dp[i][j],dp[i][k]+dp[k+1][j]+s[j]-s[i-1])

j-1\geqslant k\geqslant i 

注:其中一维数组s表示石子质量的前缀和数组,故求第i堆到第j堆石子重量的和为

       s[j]-s[i-1] 

dp数组构建代码如下:

        //区间长度
        for(int len = 2; len <= n;len++){
            //枚举左端端点
            for(int i = 1; i + len - 1 <= n;i++){
                //最右端端点
                int j = i + len -1;
                //初始化
                dp[i][j] = Integer.MAX_VALUE;mei
                //左右端点相等,那么就一堆,不需要进行操作
                if(i == j){
                    dp[i][j] = 0;
                }
                //枚举中间端点
                for(int k = i; k <= j-1;k++){
                    dp[i][j] = Math.min(dp[i][j],dp[i][k]+dp[k+1][j]+s[j]-s[i-1]);
                }
            }
        }

二、代码如下

代码如下(示例):

import java.io.*;
import java.util.ArrayList;
import java.util.Scanner;

public class 石子合并 {
    static PrintWriter pw = new PrintWriter(new OutputStreamWriter(System.out));
    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    static StreamTokenizer st = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));

    public static void main(String[] args) {
        Scanner  sc = new Scanner(new BufferedReader(new InputStreamReader(System.in)));
        int n = sc.nextInt();
        int[] s = new int[310];
        int[][] dp = new int[310][310];
        for(int i = 1; i <= n;i++){
            s[i] = sc.nextInt();
        }
        for(int i = 1;i <= n;i++){
            s[i] = s[i]+s[i-1];
        }
        //区间长度
        for(int len = 2; len <= n;len++){
            //枚举左端端点
            for(int i = 1; i + len - 1 <= n;i++){
                //最右端端点
                int j = i + len -1;
                //初始化
                dp[i][j] = Integer.MAX_VALUE;
                //左右端点相等,那么就一堆,不需要进行操作
                if(i == j){
                    dp[i][j] = 0;
                }
                //枚举中间端点
                for(int k = i; k <= j-1;k++){
                    dp[i][j] = Math.min(dp[i][j],dp[i][k]+dp[k+1][j]+s[j]-s[i-1]);
                }
             }
        }
        pw.println(dp[1][n]);
        pw.flush();
    }
}

2.读入数据

代码如下(示例):

4
1 3 5 2

3.代码运行结果如下:

22

总结

石子合并问题是经典的区间dp问题,我们需要枚举中间端点k的情况从而来推出dp数组的值。

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

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

相关文章

CY7.5-COOH荧光属性Cyanine7.5花菁染料

CY7.5-COOH&#xff0c;作为一种Cyanine 7.5花菁染料&#xff0c;在荧光属性上表现出色。其独特的化学结构赋予了它荧光性质&#xff0c;使其在生物标记、荧光成像和光学传感等领域具有诸多应用前景。 CY7.5-COOH具有出色的荧光量子产率&#xff0c;这意味着在激发光的照射下&…

电商市场价格治理的有效方法

监测价格的目的是为了治理价格&#xff0c;品牌在发展过程中必然要做价格管控&#xff0c;否则任由渠道自由生长&#xff0c;最后的结果多是低价不断&#xff0c;且渠道愈发难以管控&#xff0c;所以在电商链接并不多时&#xff0c;也应对渠道进行监测、治理&#xff0c;将渠道…

【学习路径】AI入门路线分享

近期整理飞书文档&#xff0c;一些权限被关掉了。看好多人在申请访问这个飞书文档&#xff0c;于是把它单独拿出来放在CSDN上&#xff0c;供大家参考~ 原视频地址&#xff1a;AI&#xff1a;从小白到入门&#xff0c;超详细人工智能成长路径分享_哔哩哔哩_bilibili 文章目录 1.…

69787987

c语言中的小小白-CSDN博客c语言中的小小白关注算法,c,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域.https://blog.csdn.net/bhbcdxb123?spm1001.2014.3001.5343 给大家分享一句我很喜欢我话&#xff1a; 知不足而奋进&#xff0c;望远山而前行&am…

ArcGIS Pro中的3D建模

在本文中,我讲述了我最近一直在探索的在 ArcGIS Pro 中设计 3D 模型的过程。 我的目标是尽可能避免与其他软件交互(即使是专门用于 3D 建模的软件),并利用 Pro 可以提供的可能性。 这个短暂的旅程分为三个不同的阶段:准备、组装和照明。 我们必须使用一些布局可能性以及一…

android平台下opencv的编译--包含扩展模块

由于项目需要使用安卓平台下opencv的扩展库&#xff0c;对于通用的opencv库&#xff0c; opencv官网提供了android的SDK 但未能提供扩展库&#xff0c;因此需要自己进行源码编译。本文记录android平台下opencv及其扩展库的交叉编译。 前提&#xff1a;主机已安装android-ndk交…

泰迪智能科技受邀参加花都区产教评技能生态链建设政策宣讲培训会

2024年4月8日&#xff0c;由广州市花都区人力资源和社会保障局主办的花都区产教评技能生态链建设政策宣讲培训会在广州市华风高级技工学校顺利举行。广东省人力资源和社会保障厅职业能力建设处鲍彬科长&#xff0c;广州市人力资源和社会保障局职业能力建设处肖飞扬科长&#xf…

volta(轻松切换管理Node.js版本)

Node.js版本管理 Volta提供了一个简单直观的命令行界面&#xff0c;可以轻松地安装、卸载、更新和切换Node.js版本。 Volta 既可以全局使用&#xff0c;也可以在项目级别使用&#xff0c;可以为每个项目单独设置node版本&#xff0c;nvm不行。 下载安装Volta 参考&#xff1a; …

JavaScript ECMAScript标准的与时俱进:从ES6至ES14的革新之路与关键技术特性剖析

ECMAScript&#xff08;通常缩写为ES&#xff09;是一种标准化的脚本语言规范&#xff0c;由ECMA International&#xff08;前身为European Computer Manufacturers Association&#xff0c;欧洲计算机制造商协会&#xff09;制定。自1997年发布首个版本以来&#xff0c;ECMAS…

JavaScript_注释数据类型

JavaScript_语法_注释&数据类型&#xff1a; 1.2注释&#xff1a; 1.单行注释&#xff1a;//注释内容 2.多行注释&#xff1a;/*注释内容*/ 1.3数据类型&#xff1a; 1.原始数据类型(基本数据类型)&#xff1a;&#xff08;只有这五种&#xff09; 1.number&#xff1a;数字…

网络安全知识知多少?

网络安全知识在当今数字化的世界中显得尤为重要。随着网络技术的不断发展和普及&#xff0c;网络安全问题也日益突出&#xff0c;对个人、组织乃至国家的安全都构成了严重威胁。因此&#xff0c;了解并掌握一些基本的网络安全知识显得尤为重要。 首先&#xff0c;我们需要明白网…

第21天:WEB攻防-JavaWeb项目UWT身份攻击组件安全访问控制;第22天:WEB攻防-JS项目Node.JS框架安全识别审计验证绕过

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【Java、PHP】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收…

利用免费AI开源引擎:实现图像识别技术在多主体检测中的应用|识别万物|本地化部署

在当今快速发展的图像处理领域&#xff0c;图像主体检测技术已成为提升图像分析效率和精度的关键工具。该技术能够自动识别和定位图像中的一个或多个主要对象&#xff0c;并提供其具体的位置坐标和分类标签。这不仅为图像编辑和优化提供了便利&#xff0c;也为后续的图像识别任…

国芯科技(C*Core)车规MCU产品选型与应用

一、MCU市场概述 MCU&#xff08;Micro Controller Unit&#xff09;即微控制器&#xff0c;俗称单片机&#xff0c;是把 CPU 的规格与频率做适当缩减&#xff0c;并将ROM、RAM、A/D转换、各式I/O接口以及Timer等功能整合在单一芯片上&#xff0c;形成芯片级的计算机。 根据…

学习记录14-运算放大器2

目录 前言 一、理想放大器 二、虚断 二、虚短 虚短的两个使用条件 1.虚短概念 2.如果我们将运放的同相端和反相端颠倒会怎样呢&#xff1f; 总结 前言 主要讲述运算放大器的虚短虚断 一、理想放大器 如果没有基础或只是想简单了解&#xff0c;可以看我前一篇文章&am…

C 强制类型转换

强制类型转换是把变量从一种类型转换为另一种数据类型。例如&#xff0c;如果您想存储一个 long 类型的值到一个简单的整型中&#xff0c;您需要把 long 类型强制转换为 int 类型。您可以使用强制类型转换运算符来把值显式地从一种类型转换为另一种类型&#xff0c;如下所示&am…

SpringBoot碎片化知识

参考资料&#xff1a; java官方词典&#xff1a;https://docs.oracle.com/javase/tutorial/information/glossary.html#F苍穹外卖&#xff1a;https://www.bilibili.com/video/BV1TP411v7v6 JavaBean规范 JavaBean规范是一种类的规范&#xff0c;其要求符合下列条件&#xf…

用Python生成纯色图片的方法

第一步 导入PIL库&#xff08;事先安装好&#xff09; 这一步如果PIL搜索不到&#xff0c;可以搜索【pillow】 第二步 设置图片的尺寸&#xff08;宽度&#xff0c;高度&#xff09;和颜色 第三步 保存图片为xx格式&#xff08;png或者jpg&#xff09; 比如生成一张红色&am…

【数据库】GROUP BY 详解、示例、注意事项

一、基本介绍 GROUP BY 语句在 SQL 中用于将来自数据库表的记录分组&#xff0c;以便可以对每个组执行聚合函数&#xff08;如 COUNT(), MAX(), MIN(), SUM(), AVG() 等&#xff09;。使用 GROUP BY 时&#xff0c;数据库会根据一个或多个列的值将结果集分为多个分组&#xff…

在windows中anaconda中安装fasttext (whl 文件安装)

Anaconda安装第三方包&#xff08;whl文件&#xff09; windows 安装fasttext 一直不成功&#xff0c;python 版本3.8 网上教程都是 https://www.lfd.uci.edu/~gohlke/pythonlibs/#fasttext 下载然后安装&#xff0c;但是这个网站里我没找到哈哈哈。。。 然后就是成功方案&am…