区间DP初探 P1880 [NOI1995]石子合并
区间$dp$,顾名思义,是以区间为阶段的一种线性$dp$的拓展
状态常定义为$f[i][j]$,表示区间$[i,j]$的某种解;
通常先枚举区间长度,再枚举左端点,最后枚举断点$(k)$
石子合并便是一道经典的区间$dp$
#include <bits/stdc++.h>
#define read read()
#define up(i,l,r) for(int i = (l);i <= (r); i++)
#define inf 0x3f3f3f3f
using namespace std;
int read
{
int x = ;char ch = getchar();
while(ch < || ch > ) ch = getchar();
while(ch>= && ch <= ) {x = * x + ch - ; ch = getchar();}
return x;
}
const int N = ;
int n,cnt[N],sum[N],f1[N][N],f2[N][N];
int main()
{
freopen("stone.in","r",stdin);
n = read;
//memset(f2,0x3f,sizeof(f2));
up(i,,n) cnt[i] = cnt[i + n] = read;//,f1[i][i] = 0,f2[i][i] = 0; ->
up(i,,((n<<)-)) sum[i] = sum[i - ] + cnt[i];//前缀和 ->[1,2n-1] 处理环;
up(L,,n)//[2,n] //枚举区间长度
up(i,,( (n<<) - L + ) ) //枚举左端点
{
int j = i + L - ;//右端点;
f1[i][j] = ; f2[i][j] = inf;//初始化;
up(k,i,(j - ))//枚举断点 [i,j)
{
f1[i][j] = max(f1[i][j],f1[i][k] + f1[k + ][j]);
f2[i][j] = min(f2[i][j],f2[i][k] + f2[k + ][j]);
}
f1[i][j] += (sum[j] - sum[i - ]);
f2[i][j] += (sum[j] - sum[i - ]);//!!加上这次合并[i,j]的分数;
}
int max_ans = ,min_ans = inf;
up(i,,n)//[1,n]
{
int j = i + n - ;
max_ans = max(max_ans,f1[i][j]);
min_ans = min(min_ans,f2[i][j]);
}
printf("%d\n",min_ans);
printf("%d",max_ans);
return ;
}
区间DP初探 P1880 [NOI1995]石子合并的更多相关文章
- 【区间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书.这部分很生疏,但是我还是选择先不管了. # ...
- P1880 [NOI1995]石子合并 区间dp
P1880 [NOI1995]石子合并 #include <bits/stdc++.h> using namespace std; ; const int inf = 0x3f3f3f3f ...
- 洛谷 P1880 [NOI1995]石子合并 题解
P1880 [NOI1995]石子合并 题目描述 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分. 试 ...
- HDU4632 Poj2955 括号匹配 整数划分 P1880 [NOI1995]石子合并 区间DP总结
题意:给定一个字符串 输出回文子序列的个数 一个字符也算一个回文 很明显的区间dp 就是要往区间小的压缩! #include<bits/stdc++.h> using namesp ...
- 洛谷 P1880 [NOI1995] 石子合并(区间DP)
传送门 https://www.cnblogs.com/violet-acmer/p/9852294.html 题解: 这道题是石子合并问题稍微升级版 这道题和经典石子合并问题的不同在于,经典的石子合 ...
- P1880 [NOI1995]石子合并【区间DP】
题目描述 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分. 试设计出1个算法,计算出将N堆石子合并成1 ...
- P1880 [NOI1995]石子合并 区间dp+拆环成链
思路 :一道经典的区间dp 唯一不同的时候 终点和起点相连 所以要拆环成链 只需要把1-n的数组在n+1-2*n复制一遍就行了 #include<bits/stdc++.h> usi ...
随机推荐
- Watcher、ZK状态、事件类型 ,权限
zookeeper有watch事件,是一次性触发的,当watch监视的数据发生变化时,通知设置了该watch的client,即watcher. 同样,其watcher是监听数据发送了某些变化,那就一定 ...
- 单例&多线程
单例模式,最常见的就是饥饿模式,和懒汉模式,一个直接实例化对象,一个在调用方法时进行实例化对象.在多线程模式中,考虑到性能和线程安全问题,我们一般选择下面两种比较经典的单例模式,在性能提高的同时,又保 ...
- f5通过vs访问其他站点的源、目的IP问题
通过VIP访问其他站点,则事实上是从服务器访问到其他站点. 如,域名 a.xin.com解析到vip 10.16.100.47(member为10.16.45.71和10.16.45.72)访问192 ...
- 数据库存储 datetime,时差问题
var offset = moment().utcOffset(); var localText = moment.utc(datetime from database).utcOffset(offs ...
- golang语言中os/user包的学习与使用
package main; import ( "os/user" "fmt" ) func main() { //返回当前用户的结构 u, _ := user. ...
- sqlserver数据库的物理存储格式和逻辑存储格式
物理存储结构: 数据库文件在磁盘上的存储形式: 主数据文件:*.mdf.用来存储数据库的启动信息.存储部分或全部的数据.整个的数据库只能有一个主数据文件 辅助数据文件:*.ndf.用于存储主数据文件未 ...
- 发现一个animate的小应用
<script src="jquery-1.11.1.js"></script> <script> //animate() : //第一个参数 ...
- OKI系列针式打印机更换色带图解教程
色带一直换不好,今天找到一个带图的教程,收藏一下 打开新色带的包装后,我们可以仔细观察一下新色带,找到里面带有一段“扭曲”色带的位置,这段色带就是:“莫比乌斯带”结构. 找到“莫比乌斯带”结构(就是有 ...
- UFT12 更新模式
一. 更新测试(非常规运行模式). 如果您知道应用程序已更改, 请以下列某种模式运行测试以相应更新测试: 维护运行模式.如果预计UFT 无法识别测试中的对象, 则使用此模式.当测试运行时, UFT ...
- nodejs 开发服务端 child_process 调试方法(1)
由于最近正在做一个服务端项目,采用了nodejs引擎开发,主要是master-worker工作机制;主进程可以直接调试,但是子进程调试好像有点麻烦,我没有找到好的方法; worker这里,我分拆成了几 ...