博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
洛谷P1880 [NOI1995]石子合并 纪中21日c组T4 2119. 【2016-12-30普及组模拟】环状石子归并...
阅读量:5272 次
发布时间:2019-06-14

本文共 3206 字,大约阅读时间需要 10 分钟。

 

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

题目描述1

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

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

输入格式

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

输出格式

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

输入输出样例

输入 #1复制
44 5 9 4
输出 #1复制
4354

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

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

题目描述2

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

输入

第一行为石子堆数N。

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

输出

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

样例输入

4 4 5 9 4 

样例输出

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=0;i
>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

1 #include
//不想OI一场空,千万别用万能头 2 #include
//快排sort() 3 #include
//能不用cin就不用 4 #include
5 #include
6 #include
7 #include
8 #include
9 #include
10 #define IL inline11 using namespace std;12 13 int s[201],n,minn=0x3f3f3f3f,maxn;14 int dpmin[201][201],dpmax[201][201];15 int sum[201];16 int main()17 {18 cin>>n;19 memset(dpmin,0x3f,sizeof(dpmin));20 for(int i=0;i
>s[i],s[i+n]=s[i];21 for(int i=0;i<2*n;i++)22 dpmin[i][i]=0;23 sum[0]=s[0];24 for(int i=1;i<2*n;i++) sum[i]=sum[i-1]+s[i];25 for(int len=2;len<=n;len++)26 {27 for(int l=0;l+len-1<2*n;l++)28 {29 for(int k=l;k

纪中Code1(70分)

1 #include
//不想OI一场空,千万别用万能头 2 #include
//快排sort() 3 #include
//能不用cin就不用 4 #include
5 #include
6 #include
7 #include
8 #include
9 #include
10 #define IL inline11 using namespace std;12 13 int s[4001],n,minn=0x3f3f3f3f;14 int f[4001][4001];15 int sum[4001];16 IL int read()17 {18 int res=0;19 char ch=getchar();20 while(ch<'0'||ch>'9')21 ch=getchar();22 while(ch>='0'&&ch<='9')23 res=(res<<1)+(res<<3)+(ch^48),ch=getchar();24 return res;25 }26 27 int main()28 {29 // freopen("stone.in","r",stdin);30 // freopen("stone.out","w",stdout);31 n=read();32 memset(f,0x3f,sizeof(f));33 for(int i=1;i<=n;i++) s[i]=read(),s[i+n]=s[i];34 for(int i=1;i<=2*n;i++)35 f[i][i]=0,sum[i]=sum[i-1]+s[i];36 for(int len=2;len<=n;len++)37 {38 for(int l=1;l+len-1<=2*n;l++)39 {40 for(int k=l;k
纪中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

与此同时……

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

转载于:https://www.cnblogs.com/send-off-a-friend/p/11392888.html

你可能感兴趣的文章
string与stringbuilder的区别
查看>>
2012-01-12 16:01 hibernate注解以及简单实例
查看>>
iOS8统一的系统提示控件——UIAlertController
查看>>
PAT甲级——1101 Quick Sort (快速排序)
查看>>
python创建进程的两种方式
查看>>
1.2 基础知识——关于猪皮(GP,Generic Practice)
查看>>
迭代器Iterator
查看>>
java易错题----静态方法的调用
查看>>
php建立MySQL数据表
查看>>
最简单的线程同步的例子
查看>>
旅途上看的电影和观后感
查看>>
qt实现类似QQ伸缩窗口--鼠标事件应用
查看>>
Ztree异步树加载
查看>>
关于IE和火狐,谷歌,Safari对Html标签Object和Embed的支持问题
查看>>
poj3320 Jessica's Reading Problem(尺取思路+STL)
查看>>
分布式计算开源框架Hadoop介绍
查看>>
安卓平台接口剖析
查看>>
坏的事情不都会带来坏的结果
查看>>
RPC的基础:调研EOS插件http_plugin
查看>>
第二次团队冲刺第二天
查看>>