P1880石子合并
1995年的noi区间dp题,这道题AC耗时达到了数月。
有一道题叫做果子合并,也是求合并的最小花费,但是那个题是可以随便合并两堆,但是这个题只能合并相邻的两堆,并且是一个环。对于环的问题,我们一般可以特判i==1和i==n或者倍增转化成链的问题,长度为两倍的时候即可涵盖所有环的情况。meanwhile我们发现了一个问题,当前要合并的两堆一定是要重合的,所以转化到了区间的问题,然后每一个最优子结构的状态是由其中的两个小小最优子结构而转移来的,所以枚举分割点即可。这样就建立了区间dp的模型。要注意最后还要进行判断,因为起点是1~2n。
1.熟记这个区间dp模型,当成模板题
2.分析每一个状态是怎么来的
3.正确处理环的做法
代码
#include<bits/stdc++.h>
#define maxn 300
using namespace std;
int dpMin[maxn][maxn];
int dpMax[maxn][maxn];
int a[maxn];//石头数目
int sum[maxn];//前缀和
int n;
int main(){
cin>>n;
for(int i=;i<=n;i++){
cin>>a[i];
a[i+n]=a[i];
}
for(int i=;i<=n*;i++){
sum[i]=sum[i-]+a[i];//前缀和
}
memset(dpMax,-,sizeof dpMax);
memset(dpMin,0x3f,sizeof dpMin);
for(int i=;i<=n*;i++){
dpMin[i][i]=;
dpMax[i][i]=;
}
//区间DP
for(int len=;len<=n;len++){
for(int i=;i<=n*;i++){
int j=i+len-;
if(j>*n) break;
for(int k=i;k<j;k++){
dpMin[i][j]=min(dpMin[i][j],dpMin[i][k]+dpMin[k+][j]+sum[j]-sum[i-]);
dpMax[i][j]=max(dpMax[i][j],dpMax[i][k]+dpMax[k+][j]+sum[j]-sum[i-]);
}
}
}
int ansMax=dpMax[][n];
int ansMin=dpMin[][n];
for(int i=;i<=n;i++){
ansMax=max(dpMax[i][i+n-],ansMax);
ansMin=min(dpMin[i][i+n-],ansMin);
}
cout<<ansMin;
puts(" ");
cout<<ansMax;
return ;
}
P1880石子合并的更多相关文章
- P1880 石子合并
P1880 石子合并 题目描述 在一个园形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分. 试设计出1个算法,计 ...
- 【洛谷】P1880 石子合并
P1880 石子合并 题目描述 在一个园形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分. 试设计出1个算法,计 ...
- 经典DP 洛谷p1880 石子合并
https://www.luogu.org/problemnew/show/P1880 题目 题目描述 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新 ...
- 洛谷P1880 石子合并(环形石子合并 区间DP)
题目描述 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分. 试设计出1个算法,计算出将N堆石子合并成1 ...
- 洛谷P1880 石子合并(区间DP)(环形DP)
To 洛谷.1880 石子合并 题目描述 在一个园形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分. 试设计出1 ...
- luogu P1880 石子合并
题目描述 在一个园形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分. 试设计出1个算法,计算出将N堆石子合并成1 ...
- 洛谷 P1880 石子合并
题目描述 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分. 试设计出1个算法,计算出将N堆石子合并成1 ...
- 【luogu】 P1880 石子合并
原题原题原题原题原题 先贴上错误代码... ↓错误代码↓ #include <iostream> #include <cstdio> #include <cstring& ...
- 洛谷P1880 石子合并
经典水题....... 断环为链长度乘二,求前缀和区间DP. #include <cstdio> #include <cstring> #include <algorit ...
随机推荐
- Python天天学_01_基础1
Python_day_01 金角大王:http://www.cnblogs.com/alex3714/articles/5465198.html ------Python是一个优雅的大姐姐 学习方式: ...
- codevs 1077 多源最短路x
题目描述 Description 已知n个点(n<=100),给你n*n的方阵,a[i,j]表示从第i个点到第j个点的直接距离. 现在有Q个询问,每个询 ...
- Apicloud_(项目)网上书城02_后端数据获取
Apicloud_(项目)网上书城01_前端页面开发 传送门 Apicloud_(项目)网上书城02_后端数据获取 传送门 Apicloud_(项目)网上书城03_拓展模块实现 传送门 ApiClou ...
- LeetCode117----填充同一层兄弟节点
给定一个二叉树 struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode *next; } 填充它的每个 ...
- npm安装 syscall access
npm WARN deprecated bower@1.8.4: We don't recommend using Bower for new projects. Please consider Ya ...
- vmx转换ofv模板,导入esxi
使用VMware Workstation安装目录下\OVFTool文件的ovftool.exe工具: 转换示例: 首先进入OVFTool根目录.然后执行 ovftool.exe "D:\ce ...
- 一、基础篇--1.2Java集合-ArrayList和Vector的区别
ArrayList和Vector的区别 ArrayList和Vector都是基于动态数组实现的. 区别 ArrayList是非线程安全的,Vector是线程安全的. Vector的方法都加了同步锁 ...
- 一、基础篇--1.1Java基础-什么是java的序列化和反序列化
什么是序列化和反序列化 序列化:把堆内存中的java对象数据,通过某种方式把对象存储到磁盘文件或者传递给其他网络节点.这个过程称为序列化.简单来说呢,就是将对象转换成二进流的过程. 反序列化:把磁盘 ...
- 全面解读php-php会话控制技术
一.PHP会话控制技术 1.为什么要使用会话控制技术? 因为http协议是无状态协议,所以同一个用户在请求同一个页面两次的时候,http协议不会认为这两次请求都来自于同一个用户,会把它们当做是两次请求 ...
- T83310 【音乐会】二重变革
T83310 [音乐会]二重变革 题解 你看数据那么大,又是一道数学题 题面描述这么个代码肯定不能傻fufu的直接把代码提交上去 我批评我自己 观察代码当中有一行 也就是说明最后这个数列都将变成同一个 ...