首页 > 其他分享 >区间dp 合并石子问题

区间dp 合并石子问题

时间:2024-04-12 20:46:28浏览次数:24  
标签:int sum 石子 合并 leq 循环 dp

合并石子问题

https://www.luogu.com.cn/problem/P1880

[NOI1995] 石子合并
题目大致描述

$N$堆石子摆成了一个圆,每相邻的两堆合成一堆,新的一堆的石子数为得分,求得分最小和最多

$1\leq N\leq 100$,$0\leq a_i\leq 20$。

解决思路:取每个区间的最大值

1、获取数据,取得前缀和

2、第一层for循环,用长度,从2到n

3、第二层for循环,用起点

4、在第三层for循环前先确定终点,然后第三层循环把每一个小区间枚举对比

关键代码实现:

//第一层 长度 
for(int len=2;len<=n;len++){
    //第二层 起始点 
    for(int i=1;i<=n-len+1;i++){
        //终点 
        int j=i+len-1;
        //由于是最小值,先赋初值 
        dpmin[i][j] = 1e9;
        //第三层  中间每一个最值
        for(int k=i;k<j;k++){
            //状态转移 本身与内部,但内部在合成后 还需要加上本次消耗的体力 
            dpmax[i][j]=max(dpmax[i][j],dpmax[i][k]+dpmax[k+1][j]+sum[j]-sum[i-1]);
            dpmin[i][j]=min(dpmin[i][j],dpmin[i][k]+dpmin[k+1][j]+sum[j]-sum[i-1]);
        }
    }
}

但是由于是圆形,需要考虑越过数组终点与数组开头合并,所以用两倍数组,可以包含所有情况:

#include<iostream>
using namespace std;
const int N = 210;
long dpmin[N][N],dpmax[N][N],sum[N];
int n;

int main()
{
	cin >> n;
	sum[0] = 0;

	for (int i = 1; i <= n; i++){
		cin >> sum[i];
		sum[i + n] = sum[i];
		sum[i] += sum[i - 1];
	}
	for (int i = n + 1; i <= 2 * n; i++)
        sum[i] += sum[i - 1];
	
	long mins = 1e9,maxs = 0;

	for (int len = 2; len <= n ; len++){
		for (int i = 1; i <= 2 * n - len + 1; i++){
			int j = i + len - 1;
			dpmin[i][j] = 1e9;
			for (int k = i; k < j; k++){
				dpmin[i][j] = min(dpmin[i][j], dpmin[i][k] + dpmin[k + 1][j] + sum[j] - sum[i - 1]);
				dpmax[i][j] = max(dpmax[i][j], dpmax[i][k] + dpmax[k + 1][j] + sum[j] - sum[i - 1]);
			}
			if (len == k){
				mins = min(mins, dpmin[i][j]);
				maxs = max(maxs, dpmax[i][j]);
			}
		}
	}
	cout << mins << endl;
	cout << maxs << endl;

	return 0;
}

标签:int,sum,石子,合并,leq,循环,dp
From: https://www.cnblogs.com/lulaalu/p/18132049

相关文章

  • 表格单元格相同值合并
     //插件网址//http://excel.wj2015.com/_book/docs/%E5%BF%AB%E9%80%9F%E4%B8%8A%E6%89%8B.html//表格单元格相同值合并//使用://引用插件库 excel.js//varcolumsName=['ModuleCNamePar'];//需要合并的列名称//varcolumsIndex=[0];//需要合并的列索引值//objLayuiExpand......
  • TCGA+GTEx基因表达数据合并 | 多癌种表达分析
     这个功能GEPIA2已经实现了,http://gepia2.cancer-pku.cn/#dataset但问题是它的数据不能导出,原图太丑,不能直接发表,那就没办法了,只能自己下载数据作图了。 TCGA数据可以批量下载GTEx数据也很容易下载但如何把TCGA的cancertype比对到GTEx特点组织,还是有点难度的。有些canc......
  • 关于期望 dp 的一点思考
    一、前言只是一些自己的理解,并不知正确与否。首先期望\(dp\)分为伪期望\(dp\)和真期望\(dp.\)二、伪期望\(dp\)对于伪期望\(dp\)来说,其在定义状态之后,一般可以认为状态之间的转移是线性的,即每一个\(dp\)状态转移到何处具有唯一对应性,只不过具体的实现上经过了概......
  • JZ25合并两个排序链表
    /***structListNode{* intval;* structListNode*next;* ListNode(intx):val(x),next(nullptr){}*};*/#include<cstddef>classSolution{public:/***代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可*......
  • 线性DP解题
    DP是一种寻找最优解的算法。DP之所以效率高,是因为DP的算法中会记录重复状态,对于同一状态值进行一次求解。线性DP是DP中属于偏简单的一类。线性DP求解的关键则在于对第一个阶段或最后一个阶段进行分类讨论。线性DP的解题方法可以分为5个步骤:找出问题的阶段性,即问题分解的方法。......
  • dmdpc安装部署
    环境:OS:Centos7DM:DMV8达梦分布计算集群英文全称DMDistributedProcessingCluster,简称DMDPC.计划生成节点,英文全称为SQLProcessor,简称为SP;数据存储节点,英文全称为BackendProcessor,简称为BP;元数据服务器节点,英文全称为MetadataProcessor,简称为MP.一个最小的......
  • Deep Deterministic Policy Gradient(DDPG)算法讲解笔记
    DDPGDeepDeterministicPolicyGradient,基于actor-critic模型提出了一个有效的valuebased连续型空间的RL算法,引入了一些帮助训练稳定的技术。基础:DQN,Batchnormm,Discretize,微积分backgroundDQN改进的推广Policybased方法(TRPO)已经在actionspace取得突破传统disc......
  • 使用 split 命令分割 Linux 文件,使用 cat 合并文件
    一些简单的Linux命令能让你根据需要分割以及重新组合文件,来适应存储或电子邮件附件大小的限制。Linux系统提供了一个非常易于使用的命令来分割文件。在将文件上传到限制大小的存储网站或者作为邮件附件之前,你可能需要执行此操作。要将文件分割为多个文件块,只需使用 split ......
  • ThreadPoolExecutor线程池解析
    ThreadPoolExecutor线程池解析一、ThreadPoolExecutor常见参数jdk中Executors提供了几种常用的线程池,底层都是ThreadPoolExecutor。publicThreadPoolExecutor(intcorePoolSize,//核心线程数intmaximumPoolSize,//最大线程数......
  • Java List集合去重、过滤、分组、获取数据、求最值、合并、排序、跳数据和遍历
    前言请各大网友尊重本人原创知识分享,谨记本人博客:南国以南i、准备工作:现有一个User类、Student类和Ticket类,加入相关依赖@DatapublicclassUser{/***id*/privateIntegerid;/***姓名*/privateStringname;/**......