洛谷P1880 [NOI1995] 石子合并 [DP,前缀和]
题目描述
在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分。
试设计出1个算法,计算出将N堆石子合并成1堆的最小得分和最大得分.
输入输出格式
输入格式:
数据的第1行试正整数N,1≤N≤100,表示有N堆石子.第2行有N个数,分别表示每堆石子的个数.
输出格式:
输出共2行,第1行为最小得分,第2行为最大得分.
输入输出样例
4
4 5 9 4
分析:显然是用DP。
由于是环状,我们需要把它转换为链状,那么就把存储石子的数组a[]空间开大一倍,从n+1~2*n存储的值等于1~n存储的值,那么只需要从1到n枚举链的开头即可,链尾则分别为n到2*n-1。这样计算和环状是等效的。
那么考虑状态转移方程,设d[i][j]是将i~j堆石子合并后得到的最大值,x[i][j]是将i~j堆石子合并后得到的最小值,首先两重循环i,j枚举区间的两端,然后再加一重循环枚举断点,也就是说,i~k和k+1~j分别是要合并的两堆石子,那么状态转移方程不难想到:
d[i][j]=max(d[i][j],d[i][k]+d[k+1][j]+a[i]+...+a[j])
x[i][j]=min(x[i][j],x[i][k]+x[k+1][j]+a[i]+...+a[j])
显然两种计算不冲突,可以同时进行,然后a[i]+...+a[j]可以用前缀和优化,那么这题也就解决了。
Code:
#include<bits/stdc++.h>
#define Fi(i,a,b) for(int i=a;i<=b;i++)
#define Fx(i,a,b) for(int i=a;i>=b;i--)
using namespace std;
const int N=;
int n,a[N],s[N],d[N][N],x[N][N];
int maxx,minn=0x3f3f3f3f;
int main()
{
ios::sync_with_stdio(false);
cin>>n;Fi(i,,n){cin>>a[i];a[n+i]=a[i];}
Fi(i,,*n)s[i]=s[i-]+a[i];
Fi(c,,n){
memset(x,0x7f,sizeof(x));
memset(d,,sizeof(d));
Fi(i,c,c+n-)d[i][i]=x[i][i]=;
Fx(i,c+n-,c)Fi(j,i+,c+n-)Fi(k,i,j-){
d[i][j]=max(d[i][j],d[i][k]+d[k+][j]+s[j]-s[i-]);
x[i][j]=min(x[i][j],x[i][k]+x[k+][j]+s[j]-s[i-]);}
maxx=max(maxx,d[c][c+n-]);
minn=min(minn,x[c][c+n-]);}
cout<<minn<<"\n"<<maxx;return ;
}
洛谷P1880 [NOI1995] 石子合并 [DP,前缀和]的更多相关文章
- 洛谷  P1880 [NOI1995]石子合并 题解
		
P1880 [NOI1995]石子合并 题目描述 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分. 试 ...
 - 洛谷P1880 [NOI1995]石子合并 纪中21日c组T4 2119. 【2016-12-30普及组模拟】环状石子归并
		
洛谷P1880 石子合并 纪中2119. 环状石子归并 洛谷传送门 题目描述1 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石 ...
 - 洛谷 P1880 [NOI1995] 石子合并(区间DP)
		
传送门 https://www.cnblogs.com/violet-acmer/p/9852294.html 题解: 这道题是石子合并问题稍微升级版 这道题和经典石子合并问题的不同在于,经典的石子合 ...
 - [洛谷P1880][NOI1995]石子合并
		
区间DP模板题 区间DP模板Code: ;len<=n;len++) { ;i<=*n-;i++) //区间左端点 { ; //区间右端点 for(int k=i;k<j;k++) ...
 - 洛谷 P1880 [NOI1995]石子合并
		
题目描述 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分. 试设计出1个算法,计算出将N堆石子合并成1 ...
 - 洛谷 P1880 [NOI1995]石子合并(区间DP)
		
嗯... 题目链接:https://www.luogu.org/problem/P1880 这道题特点在于石子是一个环,所以让a[i+n] = a[i](两倍长度)即可解决环的问题,然后注意求区间最小 ...
 - 【区间dp】- P1880 [NOI1995] 石子合并
		
记录一下第一道ac的区间dp 题目:P1880 [NOI1995] 石子合并 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 代码: #include <iostream> ...
 - 区间DP小结 及例题分析:P1880 [NOI1995]石子合并,P1063 能量项链
		
区间类动态规划 一.基本概念 区间类动态规划是线性动态规划的拓展,它在分阶段划分问题时,与阶段中元素出现的顺序和由前一阶段的那些元素合并而来由很大的关系.例如状态f [ i ][ j ],它表示以已合 ...
 - P1880 [NOI1995]石子合并[区间dp+四边形不等式优化]
		
P1880 [NOI1995]石子合并 丢个地址就跑(关于四边形不等式复杂度是n方的证明) 嗯所以这题利用决策的单调性来减少k断点的枚举次数.具体看lyd书.这部分很生疏,但是我还是选择先不管了. # ...
 
随机推荐
- Jade模板引擎学习(二)语法:代码、变量、循环、过滤器及mixin
			
Jade语法 一.代码 不会被缓冲代码 ul - for(var i=0; i; i++) li Jade Engine 会转换为: <ul> <li>Jade Engine& ...
 - linux上抓包
			
使用tcpdump命令. 使用tcpdump -help查看其用法. -i eth0:在第一块网卡上进行抓包. -w filename.cap:将抓的保存到当前目录下的filename.cap文件中, ...
 - Flask从入门到放弃1:路由app.route()
			
Flask从入门到放弃1: Flask中的路由app.route(): 参考来源:http://python.jobbole.com/80956/ https://www.raspberrypi.or ...
 - 省队集训 Day5 选举
			
[题目大意] 小奇和魔法猪要竞选膜钟国的总统. 有 $n$ 个选民,编号为$1...n$,他们中有的人支持小奇,有的人支持魔法猪,还有的人保持中立. 现在你需要把选民分成若干个区间,每个区间的长度在$ ...
 - bzoj 2957: 楼房重建 ——线段树
			
Description 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题,我们考虑这些 ...
 - bASE--Risk
			
//参考base-4.0.2.jar public class Risk implements Serializable //规则名public String ruleName; //规则包名publ ...
 - HTTP响应码摘自apach官网
			
HTTP状态列表 响应码由三位十进制数字组成,它们出现在由HTTP服务器发送的响应的第一行. 响应码分五种类型,由它们的第一位数字表示: 1xx:信息,请求收到,继续处理 2xx:成功,行为被成功地接 ...
 - 安装sysstat出现软件包依赖问题
			
需要使用Linux性能分析工具iostat 和sar等, 这就需要安装软件包sysstat 在Ubuntu 12.04下运行sudo apt-get install sysstat,出现如下问题: 开 ...
 - 20180104 wdcp中的mysql重启不成功
			
1.重启不成功是由于/www/wdlinux/mysql-5.5.54/data 中的ib_logfile0.ib_logfile1 和ibdata1的文件存在,可用netstat -lnpt查看当前 ...
 - DOM编程艺术读书笔记 (须熟读)
			
http://www.qdfuns.com/notes/39151/00d8bc6322359f00450f492ae56bf69e.html