洛谷P1880 石子合并 纪中2119. 环状石子归并

洛谷传送门

题目描述1

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

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

输入格式

数据的第1行试正整数N,1≤N≤100,表示有N堆石子.第2行有N个数,分别表示每堆石子的个数.

输出格式

输出共2行,第1行为最小得分,第2行为最大得分.

输入输出样例

输入 #1复制

4
4 5 9 4
输出 #1复制

43
54

(File IO): input:stone.in output:stone.out

时间限制: 1000 ms  空间限制: 262144 KB  具体限制  

Goto ProblemSet

题目描述2

在一个环状跑道上摆放着N堆石子,现在要将所有的石子有次序地合并成一堆。规定每次只能选取相邻的两堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分。问最少的总得分是多少?

输入

第一行为石子堆数N。
从第2行到第N + 1行,每行一个正整数。第i个数表示第i堆石子的石子数。

输出

在第一行输出一个整数,表示最少的总得分。

样例输入

4
4
5
9

样例输出

43 

数据范围限制

在40%的数据中,1 ≤ N ≤ 100
在60%的数据中,1 ≤ N ≤ 200
在100%的数据中,1 ≤ N ≤ 2000
保证输入数据中每堆石子的石子数不超过10000

Solution

此题为区间DP+四边形不等式

这是我第一次见到区间DP

洛谷上既要求最大值,也要求最小值,(多写几句话的事~)但是数据范围最大只有100

jzoj上就恶心了,虽然只要求最小值,但是数据范围最大为2000!

Algorithm1

标准的区间DP

由于这是环形的,所以要把整个跑道复制一遍

可以在输入的同时操作

(约定:s[i]表示第i(0~n-1)堆石子的数量)

for(int i=;i<n;i++) cin>>s[i],s[i+n]=s[i];

做DP前要先弄清楚“阶段”,“状态”,“决策”;

由于首先要合并两堆,再在两堆的基础上合并三堆,再在三堆的基础上合并四堆……以此类推。

并且,每次要选相邻的两堆合并(这就是为什么不能像“合并果子那样使用贪心”)

所以,每一个阶段就是合并去=的区间长度 len

这个len在循环的最外层,从2至n(最少合并2堆)

其次是状态

状态即为最初的第l堆石子和第r堆石子被合并,

同时l~r这段区间的长度为阶段——len。

所以我们要枚举的状态就是左端点

范围:左极限为0,右极限为右端点<n

最内层是决策

顾名思义:

就是决定当前应该选哪两堆来合并

对于目前长度为len的区间[l,r)

可以选出一个中间点k∈[l,r)

表示先合并了[l,k],再合并[k+1,r)

所以决策就是中间点k

同时还要计算合并这两堆石子所需要的体力(即为两堆石子的石子数量之和)

可以使用前缀和计算

Code1

洛谷Code

 #include<iostream>//不想OI一场空,千万别用万能头
#include<algorithm>//快排sort()
#include<cstdio>//能不用cin就不用
#include<cstring>
#include<cmath>
#include<map>
#include<set>
#include<vector>
#include<queue>
#define IL inline
using namespace std; int s[],n,minn=0x3f3f3f3f,maxn;
int dpmin[][],dpmax[][];
int sum[];
int main()
{
cin>>n;
memset(dpmin,0x3f,sizeof(dpmin));
for(int i=;i<n;i++) cin>>s[i],s[i+n]=s[i];
for(int i=;i<*n;i++)
dpmin[i][i]=;
sum[]=s[];
for(int i=;i<*n;i++) sum[i]=sum[i-]+s[i];
for(int len=;len<=n;len++)
{
for(int l=;l+len-<*n;l++)
{
for(int k=l;k<l+len-;k++)
dpmin[l][l+len-]=min(dpmin[l][l+len-],dpmin[l][k]+dpmin[k+][l+len-]),
dpmax[l][l+len-]=max(dpmax[l][l+len-],dpmax[l][k]+dpmax[k+][l+len-]);
dpmin[l][l+len-]+=sum[l+len-]-sum[l-];
dpmax[l][l+len-]+=sum[l+len-]-sum[l-];
}
}
for(int i=;i<n;i++)
minn=min(minn,dpmin[i][i+n-]),maxn=max(maxn,dpmax[i][i+n-]);
cout<<minn<<endl<<maxn;
return ;
}

纪中Code1(70分)

 #include<iostream>//不想OI一场空,千万别用万能头
#include<algorithm>//快排sort()
#include<cstdio>//能不用cin就不用
#include<cstring>
#include<cmath>
#include<map>
#include<set>
#include<vector>
#include<queue>
#define IL inline
using namespace std; int s[],n,minn=0x3f3f3f3f;
int f[][];
int sum[];
IL int read()
{
int res=;
char ch=getchar();
while(ch<''||ch>'')
ch=getchar();
while(ch>=''&&ch<='')
res=(res<<)+(res<<)+(ch^),ch=getchar();
return res;
} int main()
{
// freopen("stone.in","r",stdin);
// freopen("stone.out","w",stdout);
n=read();
memset(f,0x3f,sizeof(f));
for(int i=;i<=n;i++) s[i]=read(),s[i+n]=s[i];
for(int i=;i<=*n;i++)
f[i][i]=,sum[i]=sum[i-]+s[i];
for(int len=;len<=n;len++)
{
for(int l=;l+len-<=*n;l++)
{
for(int k=l;k<l+len-;k++)
f[l][l+len-]=min(f[l][l+len-],f[l][k]+f[k+][l+len-]);
f[l][l+len-]+=sum[l+len-]-sum[l-];
}
}
for(int i=;i<=n;i++)
minn=min(minn,f[i][i+n-]);
cout<<minn;
return ;
}

纪中Code1

为什么折叠?

纪中此题的范围是2000,要用到四边形不等式优化成n2才能过……毒瘤呀

Attention1

所有数组都要开两倍大——这是环状变链状。

Algorithm2

四边形不等式

对于一个函数f(i,j),有四个值a<=b<c<=d

使得f(a,b)+f(c,d)<f(a,c)+f(b,d)

那么这个函数满足四边形不等式

可以放到决策k时使用

至于证明嘛……打表证吧

Impression

2019-08-22 11:51:55

与此同时……

哪个人知道我们听不懂今天的讲课会都回来,故意放了比赛???

洛谷P1880 [NOI1995]石子合并 纪中21日c组T4 2119. 【2016-12-30普及组模拟】环状石子归并的更多相关文章

  1. 纪中21日T3 2118. 【2016-12-30普及组模拟】最大公约数

    纪中21日T3 2118. 最大公约数 (File IO): input:gcd.in output:gcd.out 时间限制: 1000 ms  空间限制: 262144 KB  具体限制 Goto ...

  2. 洛谷 P1880 [NOI1995]石子合并 题解

    P1880 [NOI1995]石子合并 题目描述 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分. 试 ...

  3. [洛谷P1880][NOI1995]石子合并

    区间DP模板题 区间DP模板Code: ;len<=n;len++) { ;i<=*n-;i++) //区间左端点 { ; //区间右端点 for(int k=i;k<j;k++) ...

  4. 洛谷 P1880 [NOI1995] 石子合并(区间DP)

    传送门 https://www.cnblogs.com/violet-acmer/p/9852294.html 题解: 这道题是石子合并问题稍微升级版 这道题和经典石子合并问题的不同在于,经典的石子合 ...

  5. 洛谷P1880 [NOI1995] 石子合并 [DP,前缀和]

    题目传送门 题目描述 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分. 试设计出1个算法,计算出将N堆 ...

  6. 洛谷 P1880 [NOI1995]石子合并

    题目描述 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分. 试设计出1个算法,计算出将N堆石子合并成1 ...

  7. 纪中21日c组模拟赛

    AWSL  AWSL  AWSL  AWSL AWSL  AWSL  AWSL  AWSL AWSL  AWSL  AWSL  AWSL AWSL  AWSL  AWSL  AWSL 题解传送 T1  ...

  8. 洛谷 P1880 [NOI1995]石子合并(区间DP)

    嗯... 题目链接:https://www.luogu.org/problem/P1880 这道题特点在于石子是一个环,所以让a[i+n] = a[i](两倍长度)即可解决环的问题,然后注意求区间最小 ...

  9. 纪中21日c组T1 1575. 二叉树

    1575. 二叉树 (File IO): input:tree.in output:tree.out 时间限制: 1000 ms  空间限制: 262144 KB  具体限制   Goto Probl ...

随机推荐

  1. TLS使用指南(一):如何在Rancher 2.x中进行TLS termination?

    引 言 这是一个系列文章,我们将在本系列中探索Rancher使用TLS证书的不同方式.TLS,安全传输层协议,是用于保护网络通信的加密协议.它是目前已经弃用的安全套接层(SSL)的继任者. 你可以从本 ...

  2. 使用Java封装一个DBUtils类(反射)

    刚开始学JavaWeb时,我是调用N个setter方法将从数据库中查询出的数据封装成JavaBean的,极其繁琐. 后来了解SpringJDBC后,发现它提供的接口非常简单,然后就想自己封装一个简单的 ...

  3. ubuntu 安装LAMP web 服务器, phpmyadmin 安装后无法打开解决

    安装方法: http://blog.chinaunix.net/uid-26495963-id-3173291.html 在上述文档中需要增加apache 支持mysql 功能. apt-get in ...

  4. Web框架之Gin介绍及使用

    Gin是一个用Go语言编写的web框架.它是一个类似于martini但拥有更好性能的API框架, 由于使用了httprouter,速度提高了近40倍. 如果你是性能和高效的追求者, 你会爱上Gin. ...

  5. num09---建造者模式

    建造者模式: 核心思想:将产品 和 产品建造过程解耦

  6. C2440 “初始化”: 无法从“std::_Vector_const_iterator<std::_Vector_val<std::_Simple_types<_Ty>>>”转换为“std::_Vector_iterator<std::_Vector_val<std::_Simple_types<_Ty>>>”

    错误原因vs已经提醒的很清楚了:无法将const_iterator转换为iterator 我的出错代码是这样的 思考了很久,最后发现原来是因为将函数定义为const的缘故. 总结:当将函数定义为con ...

  7. 菜鸡发现腾讯视频bug

    腾讯视频bug 我看一个将夜,出现三生三世? 这是为啥? 发现bug,会得到奖励吗? 不会像dnf一样游戏自己的bug,然后出现伤害999,把我号封了. 我这样会被封号吗?我应该怎么做才不会被封?好慌 ...

  8. linux命令之---ping

    1)命令简介 ping命令用来测试主机之间网络的连通性.执行ping指令会使用ICMP传输协议,发出要求回应的信息,若远端主机的网络功能没有问题,就会回应该信息,因而得知该主机运作正常. 2)命令参数 ...

  9. MySql Docker的一些操作方法

    偶尔有需求,涉及到数据库的改动,那一定要表结构改动.程序调试都先在测试环境淬炼千百遍. 现在流行微服务.docker部署,很容易拉起一整套环境. Compose File Demo mysql: im ...

  10. 解决github图片不显示的问题

    修改hosts C:\Windows\System32\drivers\etc\hosts 在文件末尾添加: # GitHub Start 192.30.253.112 Build software ...