区间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 ...
随机推荐
- Android 支付宝/微信支付结果判断
微信支付结果码 private static final int PAY_OK = 0; //交易成功 private static final int PAY_ERR = -1; //交易失败 pr ...
- 200. Number of Islands (Graph)
Given a 2d grid map of '1's (land) and '0's (water), count the number of islands. An island is surro ...
- JS获取鼠标左(右)滑事件
鼠标左(右)滑也是网站开发中常见的效果之一,这里对鼠标左(右)滑做出一些解释. 首先要获取需要左右滑事件的节点: eg: var div=document.getElementById("d ...
- js对键盘输入事件绑定到特定按钮
转自:https://www.cnblogs.com/liluping860122/archive/2013/05/25/3099103.html<script type="text/ ...
- 微信小程序开发——以简单易懂的浏览器页面栈理解小程序的页面路由
前言: 对于小程序的页面路由,如果没有一定开发经验的话,理解起来还是会有些困难的.哪怕是有一定小程序开发经验的开发者,能够完全理解掌握的恐怕也不多. 这里就以另外一种方式来详细的介绍小程序的页面栈及路 ...
- 【mysql】分区表
分区表是什么? 分区表可以按照事先创建的规则,对mysql的记录进行分组,每一个组具有一个独立的逻辑单元来存储该组的数据.典型的如:按照创建时间的年份分组,按照id的顺序分组(每1000万条数据分一个 ...
- SQL Server 2008 R2如何生成带数据的数据库脚本
1.对想要复制的数据库右键,“任务”,“生成脚本” 2.下面需要注意的是,默认情况下,只会生成仅架构的脚本,也就是说仅仅有表结构,而没有数据的空壳.所以需要额外的设置. 在设置脚本编写选项,选择“高级 ...
- android 下拉刷新框架PullToRefreshScrollView(com.handmark.pulltorefresh)
很简单,实现OnRefreshListener这个监听器. mPullRefreshScrollView .setOnRefreshListener(new OnRefreshListener< ...
- 各个JSON技术的比较(Jackson,Gson,Fastjson)的对比
JSON技术的调研报告 一 .各个JSON技术的简介和优劣 1.json-lib json-lib最开始的也是应用最广泛的json解析工具,json-lib 不好的地方确实是依赖于很多第三方包, 包括 ...
- Swift 错误记录
最近几天开始学习Swift,作为一个从 OC 转到 Swift 的程序员,我一直以为很简单.但是现在学习一个星期之后,发现问题还是蛮多的! 最大的问题就是 太特么 不习惯了!!!!!!!!!! 好吧, ...