洛谷 P1080 石子合并 ( 区间DP )
题意 : 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分。试设计出1个算法,计算出将N堆石子合并成1堆的最小得分和最大得分。
分析 :
有大佬给出了四边形不等式优化........
发现并不会,于是开始学习区间DP的写法
对于某一个特定的区间 (i, j) 其合并成一个石子是从
某两个属于这个区间且连续不相交区间合并而来
即假设有断点 k 则 (i, j) = (i, k) + (k+1, j) + Sum(i, j)
这里定义 Sum(i, j) 为 i 到 j 这个区间石子的总和、前缀和可实现
只要枚举断点就可以知道 (i, j) 的最优值是多少了
定义 dp[i][j] = 区间 i 到 j 的石子合并代价的最值
转移方程就是枚举断点 dp[i][j] = dp[i][k] + dp[k+1][j] + Sum(i, j)
但是这个有一个坑,如果你用三重循环,分别表示
区间开头 i、区间结尾 j、区间断点 k 来进行 状态转移
这样是错误的,因为 dp[k+1][j] 在这样的循环下是还未确定的
所以有个技巧就是将一重循环变成区间长度,即
区间长度 len、区间开头 i、区间断点 k
还有一个问题就是,题目给出来的石头是链装的
只要“断环为链”即复制一份黏到末尾就行了
#include<bits/stdc++.h> using namespace std; const int INF = 0x3f3f3f3f; ; int dp1[maxn][maxn], dp2[maxn][maxn]; int PreSum[maxn]; int arr[maxn]; int N; int main(void) { scanf("%d", &N); memset(dp1, , sizeof(dp1)); memset(dp2, , sizeof(dp2)); memset(PreSum, , sizeof(PreSum)); ; i<=N; i++){ scanf("%d", &arr[i]); arr[i+N] = arr[i]; } ; i<=(N<<); i++) PreSum[i] = PreSum[i-] + arr[i]; ; len<=N; len++){ ; i<=(N<<)-len+; i++){ ; , MM = INF; for(int k=i; k<j; k++){ MM = min(MM, dp1[i][k]+dp1[k+][j]+PreSum[j]-PreSum[i-]); MX = max(MX, dp2[i][k]+dp2[k+][j]+PreSum[j]-PreSum[i-]); } dp1[i][j] = MM; dp2[i][j] = MX; } } , MM = INF; ; i<=N; i++){ MM = min(MM, dp1[i][i+N-]); MX = max(MX, dp2[i][i+N-]); } printf("%d\n%d\n", MM, MX); ; }
洛谷 P1080 石子合并 ( 区间DP )的更多相关文章
- 洛谷P1880 石子合并(区间DP)(环形DP)
To 洛谷.1880 石子合并 题目描述 在一个园形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分. 试设计出1 ...
- 洛谷 P1880 [NOI1995] 石子合并(区间DP)
传送门 https://www.cnblogs.com/violet-acmer/p/9852294.html 题解: 这道题是石子合并问题稍微升级版 这道题和经典石子合并问题的不同在于,经典的石子合 ...
- 洛谷P1880 石子合并(环形石子合并 区间DP)
题目描述 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分. 试设计出1个算法,计算出将N堆石子合并成1 ...
- 经典DP 洛谷p1880 石子合并
https://www.luogu.org/problemnew/show/P1880 题目 题目描述 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新 ...
- 石子合并 区间dp模板
题意:中文题 Description 在操场上沿一直线排列着 n堆石子.现要将石子有次序地合并成一堆.规定每次只能选相邻的两堆石子合并成新的一堆, 并将新的一堆石子数记为该次合并的得分.允许在第一次合 ...
- HDU4632 Poj2955 括号匹配 整数划分 P1880 [NOI1995]石子合并 区间DP总结
题意:给定一个字符串 输出回文子序列的个数 一个字符也算一个回文 很明显的区间dp 就是要往区间小的压缩! #include<bits/stdc++.h> using namesp ...
- 洛谷 P1880 石子合并
题目描述 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分. 试设计出1个算法,计算出将N堆石子合并成1 ...
- 洛谷P1040 加分二叉树(区间dp)
P1040 加分二叉树 题目描述 设一个n个节点的二叉树tree的中序遍历为(1,2,3,…,n),其中数字1,2,3,…,n为节点编号.每个节点都有一个分数(均为正整数),记第i个节点的分数为di, ...
- 石子合并 区间DP模板题
题目链接:https://vjudge.net/problem/51Nod-1021 题意 N堆石子摆成一条线.现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆石子合并成新的一堆,并将新的一堆石 ...
随机推荐
- shell脚本一键部署nginx
一键部署nginx 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 ...
- Selenium+PhantomJs 爬取网页内容
利用Selenium和PhantomJs 可以模拟用户操作,爬取大多数的网站.下面以新浪财经为例,我们抓取新浪财经的新闻版块内容. 1.依赖的jar包.我的项目是普通的SSM单间的WEB工程.最后一个 ...
- seata项目结构
1. 概述 在拉取 Seata 项目后,我们会发现拆分了好多 Maven 项目.
- TCP listener
调试时未关闭之前开启的TCP SERVER: 应该关闭: TcpListener TcpClient 1.开启TCP listener (1)Start()方法失败 异常位置:该异常的产生位置为 tc ...
- C语言---进制
1. 何为进制 进位机制,逢几进一.数值某一位置上的数在运算时是逢几进一. 生活中的进制:十进制.十二进制(12个月是1年).六十进制(60秒是1分钟) 计算机编程中的进制:二进制.八进制.十六进制. ...
- python 安装 colorama 控制台输出彩色文字
pip install colorama from colorama import Back,Fore,Style # 字体颜色print(Fore.LIGHTBLUE_EX,'HelloWorLd' ...
- python中self与__init__怎么解释能让小白弄懂?
python中self与__init__怎么解释能让小白弄懂? 这个问题其实没那么简单. 只说一下自己的理解. python 里所有的 object 都有三个属性, 标识(identity), 类型( ...
- java8之stream和lambda表达式
JAVA 8 已经推出有一段时间了, 相比之前, 我们操作集合的方式应该是这样? 代码:List<String> list = new ArrayList<>(); list. ...
- vue-cli设置引入目录
打开build/webpack.base.conf.js 找到module.exports下的resolve这行 刚开始是这样的 resolve: { extensions: ['.js', '.vu ...
- java gRPC四种服务类型简单示例
一.gRPC 简介 gRPC 是Go实现的:一个高性能,开源,将移动和HTTP/2放在首位通用的RPC框架.使用gRPC可以在客户端调用不同机器上的服务端的方法,而客户端和服务端的开发语言和 运行环境 ...