首页 > 其他分享 >石子合并

石子合并

时间:2024-09-08 16:35:25浏览次数:9  
标签:前缀 int 石子 合并 len 枚举

**(区间DP) **

0.思路

关键点:最后一次合并一定是左边连续的一部分和右边连续的一部分进行合并

如何分类:最后一次分界线的位置来分类,分成k类之后,每一类取最小代价
步骤
1.枚举[l,r]区间的长度
2.对于每个长度的区间
枚举起点———— 合并开始的位置

for(int i = 1;i + len - 1 <= n;i ++)

对应的就有终点———— 合并结束的位置

j = i + len -1;

3.枚举分界点 k
for(int k = i ;k < j;k++)

!k不能等于j

1.说明右端至少有1堆
2.在下面进行说明

1.状态定义

f[i][j] : 将 i到j 这一段石子合并成一堆的方案的集合

2.状态计算

** f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]+sum[j]-sum[i-1]);**

从这里f[k+1][j]看出k!=j,如果k=j的话 k+1>j就会产生矛盾

3.初始化

1.区间长度为1的时候力贡献为0
2.由于是取最小值,将f[i][j]=INF;

4.前缀和

for(int i=1;i<=n;i++){
    sum[i]=sum[i-1]+a[i];  //维护区间和
}

C++ 代码

#include <bits/stdc++.h>
using namespace std;

const int N = 310;

int n;
int a[N],s[N]; //前缀和 
//从第i堆到第j堆合并的代价 
int f[N][N]; 

int main(){
	cin>>n;
	for (int i=1;i<=n;i++){
		cin>>a[i];
		s[i]=s[i-1]+a[i];   //计算前缀和 
	}
	
	for(int len=2;len<=n;len++) //枚举区间长度  
	 for(int i=1; i+len-1<=n;i++){  //枚举起点 
	 	int l=i,r=i+len-1;   //l为左端点,r为右端点  
	 	//枚举每个分界点k 
	 	 f[l][r]=1e9;   //因为取得是最小值所以初始化最大值 
	     for(int k = l;k < r;k ++) //k 的范围 (1,j-1) -j-1是因为右边至少有一堆  
	     f[l][r]=min(f[l][r],f[l][k]+f[k+1][r]+s[r]-s[l-1]);  //s[r]-s[l-1] 是[l,r]区间的总价值
	 } 
	 cout<<f[1][n];
	 return 0;
} 

标签:前缀,int,石子,合并,len,枚举
From: https://www.cnblogs.com/ltphy-/p/18403102

相关文章

  • C# 多个PDF文档合并,带增加书签,两个A4合并到一页A3上
    此处用到的库是Itextsharp///<summary>///合成pdf文件///</summary>///<paramname="pdffileList"></param>///<paramname="outMergeFile"></param>///<paramname="RemovedOldFile"></param&g......
  • Leetcode算法挑战:详解如何实现交替合并字符串的解题思路
    Leetcode算法挑战中的“交替合并字符串”问题,要求我们将两个字符串以交替的方式合并,终形成一个新的字符串。乍一看,这道题目似乎不复杂,但要写出高效且简洁的解法,还需要一定的思路和技巧。一、问题描述题目要求给定两个字符串word1和word2,将它们按照索引依次交替合并。如果某个......
  • elementplus vue3 table表格动态合并单元格
    letcellList:any[]=[]//单元格数组letcount:number=0//计数constcomputeCell=(tableList:any[],name)=>{cellList=[]count=0for(leti=0;i<tableList.length;i++){if(i===0){//先设置第一项cellList.push(1)......
  • LeetCode Hot100刷题记录-21. 合并两个有序链表
    题目描述:将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。需要知道的pre-knowledge:list1和list2起初可直接代表两个链表的头节点,无需用另外的变量比如current来表示头节点。思路:准备一个虚拟节点,指向合并完成新链表的h......
  • 力扣 88.合并两个有序数组
    思路:比较两个数组中最大的数(数组是非递减的),选取大的那个,从nums1的最后边赋值..../***@param{number[]}nums1*@param{number}m*@param{number[]}nums2*@param{number}n*@return{void}Donotreturnanything,modifynums1in-placeinstead.......
  • Java中的服务拆分与合并:微服务架构的演进
    Java中的服务拆分与合并:微服务架构的演进大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!随着业务的不断扩展和用户数量的增加,传统的单体应用架构已经无法满足快速迭代和高并发的需求。微服务架构以其模块化和灵活性成为了现代应用架构的首选。在微服......
  • LigerUI 中的 Grid (ligerGrid) 合并单元格
    在网上搜索了很都都没有正确的方法实现合并单元格,LigerGrid不像 EasyUI 中的Grid可以直接合并单元格。我化了点时间,解决了,就分享给大家,我就不做详细的注释,只有有一定基础的都可以看懂,菜鸟就自己去补习吧。<divid="maingrid"style="margin:0;padding:0"></div......
  • 23合并 K 个升序链表
    我嘞个二维数组有点小夸张了哈这个题目我最开始看就回想两个有序链表的排序,但是如果这样排,那要排k次,每次排序还有相应时间复杂度,工程量之大,相当恐怖那么这个时候我们就想起来去用堆最小堆,非子叶节点小于子叶节点,可以导致根节点是最小的,那么我们只需要把所有数据全部插......
  • 【数据结构和算法实践-链表-LeetCode23-合并K个有序数组】
    合并K个有序数组题目MyThought代码示例JAVA-8题目合并K个有序数组MyThought一、将ListNode放入PriorityQueue中1.1、设置PriorityQueue的比较器规则1.2、将ListNode[]放入priorityQueue二、再将数据依次弹出放到ListNode中代码示例JAVA-8publicListNod......
  • Python批量分割Excel后逐行做差、合并文件的方法
      本文介绍基于Python语言,针对一个文件夹下大量的Excel表格文件,基于其中每一个文件,首先依据某一列数据的特征截取我们需要的数据,随后对截取出来的数据逐行求差,并基于其他多个文件夹中同样大量的Excel表格文件,进行数据跨文件合并的具体方法。  首先,我们来明确一下本文的具体需......