首页 > 其他分享 >石子合并(弱化版)

石子合并(弱化版)

时间:2023-06-10 09:55:18浏览次数:35  
标签:弱化 int sum 石子 合并 代价 dp

石子合并(弱化版)

题目描述

设有 \(N(N \le 300)\) 堆石子排成一排,其编号为 \(1,2,3,\cdots,N\)。每堆石子有一定的质量 \(m_i(m_i \le 1000)\)。现在要将这 \(N\) 堆石子合并成为一堆。每次只能合并相邻的两堆,合并的代价为这两堆石子的质量之和,合并后与这两堆石子相邻的石子将和新堆相邻。合并时由于选择的顺序不同,合并的总代价也不相同。试找出一种合理的方法,使总的代价最小,并输出最小代价。

输入格式

第一行,一个整数 \(N\)。

第二行,\(N\) 个整数 \(m_i\)。

输出格式

输出文件仅一个整数,也就是最小代价。

样例

样例输入 #1

4
2 5 3 1

样例输出 #1

22

解析

令\(dp[i][j]\)表示区间\([i,j]\)的最小价值。

不妨从终点考虑问题,即结果为两个子区间合并的最小值再加上合并需要的代价即可。

枚举两个子区间,即枚举这个区间的中间点\(k\),使这个区间被分为\([i,k]\)和\([k+1,j]\)两个区间,取一遍最小值加上合并的即为当前区间所求。

至于合并的代价,用前缀和即可。

所以$$dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]+sum[j]-sum[i-1])$$

代码

#include<bits/stdc++.h>
using namespace std;
int dp[310][310],a[310],sum[310];
int main()
{
	int n;
	cin>>n;
	memset(dp,0x3f,sizeof(dp));//初始化1,因为是求最小代价,所以初始化设为很大的一个数,为了后面更新。
	for(int i=1;i<=n;i++)
	{
		cin >> a[i];
		sum[i]=sum[i-1]+a[i];
		dp[i][i]=0;//初始化2,他自己本身的代价为0。
	}
	for(int len=2;len<=n;len++)
	{
		for(int i=1;i<=n-len+1;i++)
		{
			int j=i+len-1;
			for(int k=i;k<j;k++)
			{
				dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]+sum[j]-sum[i-1]);
			}
		}
	}
	cout<<dp[1][n];
}

标签:弱化,int,sum,石子,合并,代价,dp
From: https://www.cnblogs.com/momotrace/p/p1775.html

相关文章

  • Python合并多幅静图为GIF动图
    给定多幅尺寸一样的静态图像文件,编写Python程序合并为GIF动图。准备工作:安装扩展库gif。打开一个PPT(144页幻灯片),另存为jpg图片,选择每张幻灯片一个图片文件。文件夹结构如下:参考代码:运行结果:......
  • Python批量拆分Excel文件中已合并的单元格
    目录(二级)第1章 基础知识/1  1.1 如何选择Python版本  1.2 Python安装与简单使用  1.3 使用pip管理扩展库  1.4 Python基础知识  1.5 Python代码编写规范  1.6 Python文件名  1.7 Python程序的__name__属性  1.8 编写自己的包 ......
  • ABAP——多表头ALV(单元格合并)
    参考:https://tricktresor.de/blog/zellen-verbinden效果:按照参考链接建立类ZCL_GUI_ALV_GRID:类方法ZCL_GUI_ALV_GRID~Z_SET_MERGE_HORIZMETHODZ_SET_MERGE_HORIZ.*ROW-ZeilederenSpaltenzusammengef�hrtwerdensollen*tab_col_merge-Spalten,diezusammen......
  • HZOI 大根堆 线段树合并
    题目描述给定一棵n个节点的有根树,编号依次为1到n,其中1号点为根节点。每个点有一个权值v_i。你需要将这棵树转化成一个大根堆。确切地说,你需要选择尽可能多的节点,满足大根堆的性质:对于任意两个点i,j,如果i在树上是j的祖先,那么v_i>v_j。请计算可选的最多的点数,注意这些点不必形成......
  • 将奇数数组与偶数数组合并为一个数组
    将奇数数组与偶数数组合并为一个数组#include<stdio.h>intmain(){inta[10];inti[10]={0,2,4,6,8};intj[10]={1,3,5,7,9};intb,c,d,e;d=e=5;c=0;for(b=0;b<d;b++){a[c]=i[b];c++;}for(b=0;b<e;b++......
  • 线段树合并学习笔记
    前言我是一个什么什么傻卵啊啊啊啊啊啊啊啊,连线段树合并都学不明白qaq正文权值线段树含义:是用来维护好多好多桶的线段树.桶是一个用来计数的东西.与普通线段树的区别普通线段树是用来维护区间和、积、最值等一系列的东西.权值线段树是用来维护某个区间内的数出现了......
  • git pull和git pull origin master (拉取远程分支合并到其他本地分支)
    gitpull用法:gitpull命令的作用是:取回远程主机某个分支的更新,再与本地的指定分支合并。一句话总结gitpull和gitfetch的区别:gitpull=gitfetch+gitmergegitfetch不会进行合并执行后需要手动执行gitmerge合并分支,而gitpull拉取远程分之后直接与本地分支进行合并。更准......
  • 【Clickhouse】ReplaceingMergeTree引擎final实现合并去重探索
    前言在OLAP实践中,在有数据更新的场景中,比如存储订单数据,我们经常会用到ReplaceingMergeTree引擎来去重数据,以获取数据的最新状态。但是ReplaceingMergeTree引擎实现数据的去重合并的操作是异步的,这样在实际查询的时候,其实是仍然有一部分数据是未进行合并的。为了保证统计数据的准......
  • 区间PD之石子合并
    设有 N堆石子排成一排,其编号为 1,2,3,…,N每堆石子有一定的质量,可以用一个整数来描述,现在要将这 N堆石子合并成为一堆。每次只能合并相邻的两堆,合并的代价为这两堆石子的质量之和,合并后与这两堆石子相邻的石子将和新堆相邻,合并时由于选择的顺序不同,合并的总代价也不相同。例如有......
  • Linq关联两个DataTable合并为一个DataTable
    DataSetds;DataTabledt1=ds.Tables[0];DataTabledt2=ds.Tables[1];//关联varres=frommindt1.AsEnumerable()fromsindt2.AsEnumerable()wherem.Field&l......