石子合并问题java,石子合并问题 GarsiaWachs算法

石子合并问题 GarsiaWachs算法

目录引入

一个较为朴素的算法

GarsiaWachs算法

引入

在一个操场上摆放着一排 \(N\) 堆石子。现要将石子有次序地合并成一堆。规定每次只能选相邻的 \(2\) 堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分。

试设计一个算法,计算出将 \(N\) 堆石子合并成一堆的最小得分。

数据范围 \(n \le 4e4\)

一个较为朴素的算法

不是暴力

按照区间DP的思路来做

设 \(f_{i, j}\) 表示区间 \([i, j]\) 合并的最小得分,枚举一个端点 \(k\),那么有转移方程:(其中 \(a\) 数组是预处理后的前缀和)

\[f_{i, j} = \min \{ f_{i, j}, f_{i, k} + f_{k + 1, j} + a_j - a_{i - 1} \}

\]

注意 \(i\) 要倒序枚举,\(j\) 要正序枚举

答案就是 \(f_{1, n}\)

时间复杂度: \(O(n^3)\);空间复杂度:\(O(n^2)\)

Code

/*

Work by: Suzt_ilymics

Knowledge:

Time: O()

*/

#includeiostream

#includecstdio

#includecstring

#includealgorithm

#define LL long long

#define orz cout"lkp AK IOI!"endl

using namespace std;

const int MAXN = 22335;

const int INF = 1e9+7;

const int mod = 1e9+7;

int n;

int a[MAXN];

int f[MAXN][MAXN];

int read(){

int s = 0, f = 0;

char ch = getchar();

while(!isdigit(ch)) f |= (ch == '-'), ch = getchar();

while(isdigit(ch)) s = (s 1) + (s 3) + ch - '0' , ch = getchar();

return f -s : s;

}

int main()

{

n = read();

for(int i = 1; i = n; ++i) a[i] = read() + a[i - 1];

for(int i = n; i = 1; --i){

for(int j = i; j = n; ++j){

if(i == j) continue;

f[i][j] = INF;

for(int k = i; k j; ++k) f[i][j] = min(f[i][j], f[i][k] + f[k + 1][j] + a[j] - a[i - 1]);

}

}

printf("%d\n", f[1][n]);

return 0;

}

GarsiaWachs算法

发现数据范围太大了,上面的算法已经不能满足我们的需求,这里有一种优化算法,专门用来解决石子问题

每次操作,从前向后找一个最小的 \(k\),使其满足 \(a_{k - 1} \le a_{k + 1}\),然后合并 \(a_{k - 1}\) 和 \(a_k\)

从 \(k\) 开始向前找到第一个 \(j\) 使得 \(a_j a_{k - 1} + a_k\),并将合并后的新值插入位置 \(j\) 后面

进行 \(n - 1\) 次结束,在合并过程中统计答案即可

时间复杂度:\(O(n^2)\);空间复杂度:\(O(n)\)

正确性证明:作为一个OI,会应用就好啦,其实是我不会

Code

/*

Work by: Suzt_ilymics

Knowledge:

Time: O()

*/

#includeiostream

#includecstdio

#includecstring

#includealgorithm

#includevector

#define LL long long

#define orz cout"lkp AK IOI!"endl

using namespace std;

const int MAXN = 1e5+5;

const int INF = 1e9+7;

const int mod = 1e9+7;

LL n, ans = 0;

vectorint a;

int read(){

int s = 0, f = 0;

char ch = getchar();

while(!isdigit(ch)) f |= (ch == '-'), ch = getchar();

while(isdigit(ch)) s = (s 1) + (s 3) + ch - '0' , ch = getchar();

return f -s : s;

}

int merge(){//GarsiaWachs算法

int k = a.size() - 2;

for(int i = 0; i a.size() - 2; ++i)

if(a[i] = a[i + 2]){

k = i; break;

}

int sum = a[k] + a[k + 1];

a.erase(a.begin() + k);

a.erase(a.begin() + k);

int inst = -1;

for(int i = k - 1; i = 0; --i)

if(a[i] sum){

inst = i; break;

}

a.insert(a.begin() + inst + 1, sum);

return sum;

}

int main()

{

n = read();

for(int i = 1; i = n; ++i) a.push_back(read());

for(int i = 1; i n; ++i) ans += merge();

printf("%lld", ans);

return 0;

}

石子合并问题 GarsiaWachs算法 相关文章

图解算法——合并k个排序列表(Merge k Sorted Lists)

1. 题目描述 You are given an array of k linked-lists lists, each linked-list is sorted in ascending order. Merge all the linked-lists into one sorted linked-list and return it. 翻译: 给定一个 链表长度为k 的链表 数组 ,每个链表按 升序 排序

three.js中,绑定 mouseup 和 mousedown 事件不起作用/使用three.js实现点谁谁变红,已解决鼠标选不到目标问题

先检查一下你是否使用了 OrbitControls 如果使用了,同时想要添加点击事件,给物体模型添加点击事件,例如添加点到谁,谁就红 代码如下: // 点击功能let raycaster = nulllet instersected = nulllet mouse = nulllet useClick = false/** * 打开addClick函

第39天学习打卡(多线程 Thread Runnable 初始并发问题 Callable )

多线程详解 01线程简介 Process与Thread 程序:是指令和数据的有序集合,其本身没有任何运行的含义,是一个静态的概念。 进程则是执行程序的一次执行过程,它是一个动态的概念。是系统资源分配的单位。 通常在一个进程中可以包含若干个线程,当然一个进程中

Ubuntu下SystemTap的安装问题解决记录

SystemTap的安装方式: 一.直接通过apt-get安装 sudo apt-get install systemtap 二.通过安装包下载 $ sudo apt-get install build-essential$ sudo apt-get install gettext$ sudo apt-get install elfutils$ sudo apt-get install libdw-dev$ wget https:/

【剑指Offer-15】二进制中1的个数

问题 请实现一个函数,输入一个整数(以二进制串形式),输出该数二进制表示中 1 的个数。例如,把 9表示成二进制是 1001,有 2 位是 1。因此,如果输入 9,则该函数输出 2。 示例 输入: 00000000000000000000000000001011 输出: 3 解释: 输入的二进制串

C++求快速幂

“快速幂”被归结为一个a的b次方对m取余的问题,即 a b % m 问题的关键在于怎么更快地求得a b ,直观的做法是用b次循环去累乘a,时间复杂度是O(b)。而“快速幂”,又成为“二分幂”,通过二分的思想能在O(log b )的复杂度内求得a b 。 如果次数b是奇数,则a

01背包问题理解动态规划算法

一.动态规划算法 简单理解:在一些分治算法解决的问题中,需要将较大规模的问题转化为较小规模的问题,往往会用到递归。但是在一些问题中,递归的小问题被多次重复运算,浪费了性能,因此可以使用数组或者其他合适的方式将运算过的小规模问题的结果记录下来

使用Python批量合并文件夹下.csv数据

实现目标:一个文件夹下包括n个.csv数据文件,想将后缀为ts.csv的文件与对应数字的.csv文件进行合并 此图为wf.csv文件中的数据格式,ts.csv文件是与此文件等行数的一列数据,将此列数据添加到已有18列数据的后面,完成数据合并操作 代码如下: import pandas

【剑指Offer-13】机器人的运动范围

问题 地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格

类似jar文件使用java无法打开问题

## 原因我一个彩笔在ctfhub,想对图片进行分割,拼接等操作,需要用到**Stegsolve**但是安装了java环境的我无法打开,经过校友的3、4次卸载安装还是没有让这个文件打开。。。(当然选择了正确的应用程序打开方式,环境变量也试了,就是打不开)命令窗口输入j

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

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

相关文章

Asterisk NAT

网络结构如下&#xff1a; asterisk(192.168.1.99) <--> 无线路由器&#xff08;公网IP: 55.66.77.88&#xff09; <-----------------------> 无线路由器&#xff08;公网IP: 21.31.41.51&#xff09; <--> eyeBeam(sip软电话: 192.168.12.43) 也就是说ast…

python读取图像数据流_浅谈TensorFlow中读取图像数据的三种方式

本文面对三种常常遇到的情况&#xff0c;总结三种读取数据的方式&#xff0c;分别用于处理单张图片、大量图片&#xff0c;和TFRecorder读取方式。并且还补充了功能相近的tf函数。1、处理单张图片我们训练完模型之后&#xff0c;常常要用图片测试&#xff0c;有的时候&#xff…

oracle无效的关联运算符,菜鸟请教:关联操作符=>用法

定位符和命名符create or replace procedure CallMe(p_ParameterA varchar2,p_ParameterB number,p_ParameterC boolean,p_ParameterD date) asbeginnull;end CallMe;declarev_Variable1 varchar2(10);v_Variable2 number(7, 6);v_Variable3 boolean;v_Variable4 date;beginCal…

asterisk的NAT配置

【转】asterisk的NAT配置 http://www.asteriskguru.com/tutorials/sip_nat_oneway_or_no_audio_asterisk.html 这篇文章已经把该说的都说了&#xff0c;能理解多少是多少&#xff01; 1. sip.conf: Externip:在[general] context配置的属性&#xff0c;配置你的公网地址&…

jeecgboot前端开发_Jeecg-Boot 技术文档

## 2.4 新版本文档请移步到&#xff1a; http://doc.jeecg.com## (重要的事情说三遍&#xff0c;注意注意注意啦&#xff01;&#xff01;&#xff01;)*** --- __![输入图片说明](https://static.oschina.net/uploads/img/201905/24164523_XDhg.png "在这里输入图片标题&…

xml与oracle对比,Oracle XML DB和DB2 pure XML在XML文档存储查询性能方面的比较分析

0引言随着互联网和信息化技术的快速发展,医院在逐步完成医院信息数字化建设过程中,它的核心技术之一就是电子病历的数字化管理和应用。电子病历包括病人就诊或治疗的全部临床信息,这些信息一般由数字、文字、图形和图像等数字信息组成。本文仅对纯文本数据电子病例的存储和查询…

sip配置

sip配置 sip--会话初始协议&#xff0c;通常用于voip电话&#xff0c;进行呼叫建立、呼叫结束以及呼叫进程中的协商。基本上&#xff0c;它帮助二个端点互相通话。sip不处理媒体;当呼叫建立之后&#xff0c;它通过实时传输协议在电话之间直接传输媒体。 SIP使用UDP5060端口进行…

[leetcode]Merge Intervals

整体不难&#xff0c;一开始以为是线段树&#xff0c;后来仔细看来不需要&#xff0c;从左到右扫&#xff0c;判断是否要merge就是了。此题有几个要注意的地方&#xff1a;1.Java的Comparator要会写&#xff1b;2.循环结束后的ans.add(tmp)不要忘记&#xff1b;3.merge的时候&a…

php公交查询系统源代码,基于Smarty公交查询系统的设计与实现(PHP,MySQL)

基于Smarty公交查询系统的设计与实现(,MySQL)(任务书,开题报告,中期报告,毕业论文11000字,程序代码,MySQL数据库,答辩PPT)本系统主要分为前台页面、后台逻辑及数据库三大部分。前台页面主要由首页&#xff0c;各查询页面及管理数据页面等&#xff0c;后台逻辑则分别针对各个页面…

xilinx芯片管脚使用限制_修复焊接BGA芯片过程

我们能够享受现代电子设备小巧玲珑但又功能强大的优点&#xff0c;得益于芯片的小型封装的优势&#xff0c;其中一个最为优秀的封装形式就是锡球阵列封装(BGA)。这种封装形式芯片的管脚是分布于芯片底部的一系列点阵排列的焊盘&#xff0c;通过均匀的锡球与PCB板连接在一起。比…

ajax请求web服务返回json格式

由于.net frameword3.5以上添加了对contenttype的检查&#xff0c;当ajax发送请求时&#xff0c;如果设置了contenttype为json&#xff0c;那么请求webservice时&#xff0c;会自动将返回的内容转为json的格式&#xff0c;json的格式iruxia{"d":"webservice方法…

linux驱动中使用定时器

我的内核是2.4.18的。Linux的内核中定义了一个定时器的结构&#xff1a; #include<linux/timer.h> struct timer_list { structlist_head list; unsigned long expires; //定时器到期时间 unsigned long data; //作为参数被传入定时器处理函数 void (*function)(uns…

matlab表达式部分项求和,matlab如何得到符号表达式中某一部分项的系数

matlab如何得到符号表达式中某一部分项的系数mip版 关注:238 答案:2 悬赏:0解决时间 2021-01-19 05:05已解决2021-01-18 14:17syms t1 t2 t3;y4*sin(t1)*cos(t2)cos(t1)sin(t1)*sin(t2)5*sin(t1)*cos(t2)*sin(t3);如何得到sin(t1)*cos(t2)的系数表达式(45*sin(t3))&#xff…

bizhubc226说明书_让打印文件不再单调 柯尼卡美能达 bizhub C226为你服务

柯尼卡美能达作为一个复合机品牌&#xff0c;除了在黑白复合机上有很大的市场&#xff0c;在彩色数码多功能复合机上也有很大的优势。这款柯尼卡美能达 bizhub C226 A3彩色数码多功能复合机可以说是彩色复合机的代表&#xff0c;在性能和打印质量方面都很不错&#xff0c;并且售…

log4net在WinForm和ASP.net下的设置

下载log4net.dll&#xff0c;放到bin目录下&#xff0c;然后引用到工程。下面说明配置和调用方法。 1、AssemblyInfo.cs末尾添加  [assembly: log4net.Config.XmlConfigurator(ConfigFileExtension "config", Watch true)] 2、App.config&#xff08;WinForm&…

A20 GPIO

1. A20的bsp给应用程序封装了gpio接口&#xff0c;其源码在bsp的位置如下&#xff1a; frameworks/base/core/java/android/os/Gpio.java frameworks/base/core/jni/android_os_Gpio.cpp 使用的时候导入javalib.jar即可 2. 下面介绍如何在驱动层操作gpio 通过搜索驱动代码&…

oracle 判断是否位汉字,js判断字符是否是汉字的两种方法小结

有时需要判断一个字符是不是汉字&#xff0c;比如在用户输入含有中英文的内容时&#xff0c;需要判断是否超过规定长度就要用到。用 Javascript 判断通常有两种方法。1、用正则表达式判断js判断字符是否是汉字.content{width:350px;overflow:hidden;border:1px solid #ddd;}fun…

git远程代码回滚_【GIT】git 删除本地分支和远程分支、本地代码回滚和远程代码库回滚...

git branch -D br【git 删除远程分支】git push origin :br (origin 后面有空格)git代码库回滚: 指的是将代码库某分支退回到以前的某个commit id【本地代码库回滚】&#xff1a;git reset --hard commit-id :回滚到commit-id&#xff0c;讲commit-id之后提交的commit都去除gi…

Eclipse与github整合完整版

最近朋友都推荐使用github管理自己的项目,而且免费用户可以有5个仓库,恰好我也想了解下git,借此机会学习一下.github官方指南使用独立第三方git工具来进行版本控制,并不借助于eclipse,但我觉得eclipse肯定也有插件来解决这类问题,就像subclipse一样. 安装egit egit目前应该是ec…

A20 看门狗驱动

任务&#xff1a;板子上增加了独立的复位芯片SP706S&#xff0c;为了在设备死机的时候重启系统。 资源&#xff1a;芯片使能管脚 PH13 喂狗管脚 PI16 1. 为了省事&#xff0c;直接在drivers/sunxi_gpio/gpio_sw.c这个文件里加了&#xff0c;这里有现成的操作GPIO管脚的函…