石子合并(区间dp)-java

石子合并问题是经典的区间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.mzph.cn/news/807868.shtml

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

相关文章

yolov9直接调用zed相机实现三维测距(python)

yolov9直接调用zed相机实现三维测距&#xff08;python&#xff09; 1. 相关配置2. 相关代码2.1 相机设置2.2 测距模块2.2 实验结果 相关链接 此项目直接调用zed相机实现三维测距&#xff0c;无需标定&#xff0c;相关内容如下&#xff1a; 1. yolov4直接调用zed相机实现三维测…

LPRNet车牌识别模型训练及CCPD数据集预处理

LPRNet车牌识别模型训练及CCPD数据集预处理 1 LPRNet车牌识别模型训练 1.1 源码:LPRNet_Pytorch-master 源码官网:GitHub - sirius-ai/LPRNet_Pytorch: Pytorch Implementation For LPRNet, A High Performance And Lightweight License Plate Recognition Framework. 链…

Windows搭建Jellyfin影音服务结合内网穿透实现公网访问本地视频文件

文章目录 1. 前言2. Jellyfin服务网站搭建2.1. Jellyfin下载和安装2.2. Jellyfin网页测试 3.本地网页发布3.1 cpolar的安装和注册3.2 Cpolar云端设置3.3 Cpolar本地设置 4.公网访问测试5. 结语 1. 前言 随着移动智能设备的普及&#xff0c;各种各样的使用需求也被开发出来&…

【Linux】vim 编辑器

Linux 系统自带了 gedit 和 vi 编辑器&#xff0c;gedit 是图形化界面的操作&#xff0c;而 vi 由比较难用&#xff0c;所以建议安装 vim 编辑器&#xff0c;vim 是从 vi 发展出来的一个文本编辑器&#xff0c;相当于增强版的 vi &#xff0c;其代码补完、编译及错误跳转等功能…

【Unity】组件组合使用心得(单行可自动拓展Scroll View)

在这之前&#xff0c;一直是在使用Scroll View进行滑动内容设置&#xff0c;但设置的都是不明不白的&#xff0c;而且有的时候设置好了之后也不知道是为什么&#xff0c;总感觉哪里不对劲&#xff0c;而且好也不知道为什么好&#xff0c;可能是长时间在做管理上的内容&#xff…

【LeetCode热题100】189. 轮转数组(数组)

一.题目要求 给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 二.题目难度 中等 三.输入样例 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮转 2 步: …

【操作系统】CentOS7入门级安装

下载镜像 CentOS镜像下载Download (centos.org) 我们选择第一个 X86_64 CentOS Mirrors List 版本描述X86_X64带64位的32位扩展版(一般安装这个)ARM64 (aarch64)嵌入式。适用于微端(树莓派、机械臂、机械中控)IBM Power (ppc64le)专用于IBM POWER服务器 选择一个合适的链接 …

【ArcGIS微课1000例】0109:ArcGIS计算归一化水体指数(NDWI)

文章目录 一、加载数据二、归一化水体指数介绍三、归一化水体指数计算四、注意事项一、加载数据 加载配套数据0108.rar(本实验的数据与0108的一致)中的Landsat8的8个单波段数据,如下所示: Landsat8波段信息对照表如下表所示: 接下来学习在ArcGIS平台上,基于Landsat8数据…

【论文精读】 GPT,GPT-2,GPT-3:大力出奇迹

系列文章目录 【论文精读】Transformer&#xff1a;Attention Is All You Need 【论文精读】BERT&#xff1a;Pre-training of Deep Bidirectional Transformers for Language Understanding 文章目录 系列文章目录一、前言二、GPT&#xff08;一&#xff09;文章概览&#xf…

20231911 马星 2023-2024-2 《网络攻防实践》实践报五告

1.实践内容 1.1 防火墙配置 任务要求:配置Linux操作系统平台上的iptables,或者Windows操作系统平台上的个人防火墙&#xff0c;完成如下功能&#xff0c;并进行测试: ①过滤ICMP数据包&#xff0c;使得主机不接收Ping包; ②只允许特定IP地址(如局域网中的Linux攻击机192.168.…

【JavaEE初阶系列】——网络编程 UDP客户端/服务器 程序实现

目录 &#x1f6a9;UDP和TCP之间的区别 &#x1f388;TCP是有连接的 UDP是无连接的 &#x1f388;TCP是可靠传输 UDP是不可靠传输 &#x1f388;TCP是面向字节流 UDP是面向数据报 &#x1f388;TCP和UDP是全双工 &#x1f469;&#x1f3fb;‍&#x1f4bb;UDP的socket ap…

共享IP和独享IP如何选择,两者有何区别?

有跨境用户在选择共享IP和独享IP时会有疑问&#xff0c;不知道该如何进行选择&#xff0c;共享IP和独享IP各有其特点和应用场景&#xff0c;选择哪种方式主要取决于具体需求和预算。以下是对两者的详细比较&#xff1a; 首先两者的主要区别在于使用方式和安全性&#xff1a;共…

使用c语言libexpat开源库解析XML数据

1 libexpat简介 Expat 是一个用 C 语言编写的开源 XML 解析库&#xff0c;以其高性能和小巧的体积著称。Expat 兼容多种操作系统平台&#xff0c;包括但不限于 Windows、Linux、macOS 等。由于其跨平台特性和简单易用的API&#xff0c;Expat 成为了许多C/C程序员解析XML文档的…

git安装配置教程(小白保姆教程2024最新版)

目录 一、Git是什么?二、安装Git1.下载git2.安装git3.检测git 三、配置Git1.配置本地信息2.配置SSH1&#xff09;SSH与SSH Key是什么&#xff1f;2&#xff09;生成SSH Key3&#xff09;获取ssh key公钥内容&#xff08;id_rsa.pub&#xff09;4&#xff09;Github账号上添加公…

【java数据结构-二叉树(上)】

java数据结构-二叉树&#xff08;上&#xff09; 二叉树的概念二叉树的节点介绍 二叉树构造如何使用兄弟表示法构造二叉树两种特别的二叉树二叉树的基本性质&#xff1a; 二叉树的存储二叉树的遍历&#xff1a;前序遍历&#xff1a;中序遍历&#xff1a;后序遍历&#xff1a;层…

【随笔】Git 基础篇 -- 远程仓库 git clone(二十五)

&#x1f48c; 所属专栏&#xff1a;【Git】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢迎大…

如何本地搭建开源导航页配置服务Dashy并发布到公网分享好友使用

文章目录 简介1. 安装Dashy2. 安装cpolar3.配置公网访问地址4. 固定域名访问 正文开始前给大家推荐个网站&#xff0c;前些天发现了一个巨牛的 人工智能学习网站&#xff0c; 通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。[点击跳转到网站] 简介 Dashy 是…

学习C++有没有必要学习boost库?

在深入学习C这一强大且灵活的编程语言的过程中&#xff0c;是否有必要学习Boost库是许多开发者会面临的一个重要问题。Boost库&#xff0c;被誉为C的“瑞士军刀”&#xff0c;以其丰富的工具集和强大的功能性深受广大C程序员的喜爱。本文将就此问题进行详细的探讨。 一、Boost…

前端开发基础(HTML5 + CSS3)【第一篇】:HTML标签之文字排版、图片、链接、音频、视频 涵盖了两个综合案例 做到了基础学得会,实战写的出

点击前往前端开发基础专栏&#xff1a; 文章目录 HTML5 CSS3 开发一、开发环境搭建下载 VS Code1. 2 插件的下载1.3 项目和文件的下载 二、 什么是 HTML2.1 标签的语法2.2 代码演示&#xff1a;2.3 小结 三 、HTML基本骨架3.1 快捷键生成HTML骨架3.2 代码展示3.3 小结 四、标…

阿里淘天一面凉经

电话面&#xff0c;秒挂。 由于答的依托。导致面试官一开始就准备要挂我了。后面问的参考性不大。 总结&#xff1a; 1.自我介绍 2.项目里自己体会比较多的&#xff0c;遇到困难比较大的技术实现。&#xff08;没复习&#xff09; 3.项目中什么场景下用到分布式锁&#xf…