首页 > 其他分享 >P1880 [NOI1995] 石子合并 (区间DP)

P1880 [NOI1995] 石子合并 (区间DP)

时间:2022-10-24 15:01:11浏览次数:55  
标签:得分 205 int NOI1995 石子 合并 P1880 leq DP

image

[NOI1995] 石子合并

题目描述

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

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

输入格式

数据的第 \(1\) 行是正整数 \(N\),表示有 \(N\) 堆石子。

第 \(2\) 行有 \(N\) 个整数,第 \(i\) 个整数 \(a_i\) 表示第 \(i\) 堆石子的个数。

输出格式

输出共 \(2\) 行,第 \(1\) 行为最小得分,第 \(2\) 行为最大得分。

样例 #1

样例输入 #1

4
4 5 9 4

样例输出 #1

43
54

提示

\(1\leq N\leq 100\),\(0\leq a_i\leq 20\)。

解析

对于环的处理,显然复制一倍做成链,然后区间DP。\(f[i][j]和g[i][j]\)分别表示将\([i,j]\)区间的石子合并成一堆后的最大/最小得分。状态转移方程:\(f[i][j] = max(f[i][k] + f[k+1][j] + sum[i][j])\),sum是前缀和。g同理。
n的范围在100以内,\(O(n^3)\)可行。

代码

#include <bits/stdc++.h>
using namespace std;
int n, ansx, ansn, f[205][205], g[205][205], a[205], s[205];
int d(int i, int j) {return s[j] - s[i - 1];}
int main() {
	scanf("%d", &n);
	for (int i = 1; i <= n; i ++) {
		scanf("%d", &a[i]);
		a[i + n] = a[i];
	}
	for (int i = 1; i <= 2 * n; i ++) s[i] = s[i - 1] + a[i]; 
	for (int len = 2; len <= 2 * n; len ++) {
		for (int i = 1, j; (j = i + len - 1) <= 2 * n; i ++) {
			g[i][j] = 1e9;
			for (int k = i; k < j; k ++) {
				f[i][j] = max(f[i][j], f[i][k] + f[k + 1][j] + d(i, j));
				g[i][j] = min(g[i][j], g[i][k] + g[k + 1][j] + d(i, j));
			}
		}
	}
	ansn = 1e9;
	for (int i = 1; i <= n; i ++) {
		ansx = max(ansx, f[i][i + n - 1]);
		ansn = min(ansn, g[i][i + n - 1]);
	}
	printf("%d\n%d", ansn, ansx);
	return 0;
}

image

标签:得分,205,int,NOI1995,石子,合并,P1880,leq,DP
From: https://www.cnblogs.com/YHxo/p/16821456.html

相关文章

  • Codeforces Round #829 (Div. 2) E // 概率dp
    题目来源:CodeforcesRound#829(Div.2)E-WishIKnewHowtoSort题目链接:Problem-E-Codeforces题意给定大小为\(n\)的仅包含\(0\)、\(1\)的数组\(a\),每......
  • PostgresqlAndPostGis
    Postgresql&PostGis问题及解决方法关于postGIS没有template_postgis模版的问题解决//1、建立普通数据库createdatabasexx;//2、然后输入官网给的这几条添加......
  • RabbitMQ.Client.Exceptions.BrokerUnreachableException:“None of the specified en
    RabbitMQ和程序运行在同一台电脑上可以使用guest账号访问如果不在同一台电脑,就会报错RabbitMQ.Client.Exceptions.BrokerUnreachableException:“Noneofthespecified......
  • chooseLocation:fail the api need to be declared in the requiredPrivateInfos fiel
    错误描述在使用uni-app开发微信小程序的时候,想要通过uni.chooseLocation获取用户地理位置的时候出现chooseLocation:failtheapineedtobedeclaredintherequiredPr......
  • docker安装wordpress--亲测OK
    环境:centos7   Wordpress:6.0.1   Mysql:8.0网上太多资料不全,主要是没有数据的配置。还是自己测试成功,才能明白。大道至简,各有其道。https://baijiahao.baidu.com......
  • Oracle使用expdp/impdp实现数据库迁移
    Oracle使用expdp/impdp实现数据库迁移导出0.准备导出路径cd/u01/app/oraclemkdirbak&&chmod777bak1、创建目录(sqlplus)createdirectorybakas'/u01/app......
  • Java多线程(3):ThreadPool(上)
    您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来~ 开完一趟车完整的过程是启动、行驶和停车,但老司机都知道,真正费油的不是行驶,而是长时间的怠速、频繁地踩刹车等动作。因......
  • oracle expdp/exp ora-600/ora-39014报错处理
    在一次数据迁移的时候,expdp导出报错,错误信息如下:  版本号:11.2.0.1没有打PSU,查看报错的aler部分日志如下:  其中的某一些trc日志文件截图:Tracefiled:\oracle\a......
  • ubantu 学习3 语言环境locale /安装软件apt-get/dpkg
    语言环境查看是否安装了中文支持locale-a如果有 zh_CN.utf8则表示系统已经安装了中文locale,如果没有则需要安装相应的软件包。安装方式如下:sudoapt-getinstall......
  • 动态DP 笔记
    矩乘大家都会!线段树大家都会!所以动态DP就这样诞生了!一些线性能做的DP可以写成广义矩阵乘法的形式,只要这个广义矩阵乘法具有结合律,那么就可以进行区间查询一类的操......