CF1312E Array Shrinking(区间dp模板)
题目链接(洛谷)
CodeForces
这是一道区间dp的板题
题意
给定一个数组,每一次对于两个相邻的数,如果他们相等,则可以将它们合并为一个数,其值为原数+1+1+1,求原数组合并完后的最小长度。
思路
首先看到这种描述,我们就可以想到区间dp
区间dp的模板:dp[i][j]=min(dp[i][k]+dp[k+1][j]+w[i])(w[i]随题目改变)区间dp的模板:dp[i][j] = \min(dp[i][k] + dp[k + 1][j] + w[i])(w[i]随题目改变)区间dp的模板:dp[i][j]=min(dp[i][k]+dp[k+1][j]+w[i])(w[i]随题目改变)
考虑令dp[i][j]dp[i][j]dp[i][j]为区间[i,j][i, j][i,j]所能合并的最小长度,w[i][j]w[i][j]w[i][j]为区间[i,j][i,j][i,j]所能合并出来的和
那么可以很简单的得出这样一个式子
dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j])dp[i][j] = \min(dp[i][j], dp[i][k]+dp[k+1][j])dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j])
然后如何可以保证这个题目上的合并呢
我们可以考虑在每次枚举i,j,ki,j,ki,j,k时像这样更新
if (dp[i][k] == 1 && dp[k + 1][j] == 1 && w[i][k] == w[k + 1][j])dp[i][j] = 1, w[i][j] = w[i][k] + 1;
最后直接输出dp[1][n]dp[1][n]dp[1][n]即可
代码
具体实现见代码:
const int N = 505, INF = 0x3f3f3f3f;
int n, dp[N][N], w[N][N];
// dp[i][j]:[i, j]区间合并的长度
// w[i][j]:[i, j]区间合并的和
int main()
{memset(dp, 0x3f, sizeof dp);rd(n);for (int i = 1; i <= n; i++)rd(w[i][i]), dp[i][i] = 1;for (int len = 2; len <= n; len++)for (int i = 1; i <= n - len + 1; i++){int j = len + i - 1;for (int k = i ; k < j; k++){dp[i][j] = min(dp[i][j], dp[i][k] + dp[k + 1][j]);if (dp[k + 1][j] == 1 && dp[i][k] == 1 && w[i][k] == w[k + 1][j]) //相邻两段长度相同都为1,且值也相同,即可更新dp[i][j] = 1, w[i][j] = w[i][k] + 1;}}pt(dp[1][n]);return 0;
}
谢谢
CF1312E Array Shrinking(区间dp模板)相关推荐
- CodeForces - 1312E Array Shrinking(区间dp)(通俗易懂)
CodeForces - 1312E Array Shrinking(区间dp) 题目链接: 没做出来,看了一下别人的题解,才A掉.但网上没发现一篇讲得比较易懂的题解,所以就准备写一篇再加上我自己的理 ...
- CodeForces - 1312E Array Shrinking(区间dp)
题目链接:点击查看 题目大意:给出 n 个数,现在可执行的操作是: 找到相邻且数值相等的两个数,即 abs( i - j ) == 1 && a[ i ] == a[ j ] 使得两个 ...
- 【动态规划dp】区间DP模板 Acwing 282. 石子合并 | P3205 [HNOI2010]合唱队
区间DP 模板 282. 石子合并 #include<iostream> #include<cmath> #include<algorithm> #include& ...
- [CF1312E]Array Shrinking
题目 传送门 to luogu 题意概要 一维线段上的 2048 \tt 2048 2048 游戏:每次两个相邻 x x x 可以合并成 x + 1 x+1 x+1 .求最少能剩下几个数字. 数据范围 ...
- P1775 石子合并(弱化版)(区间dp模板)
石子合并(弱化版) - 洛谷 /** @Description: To iterate is human, to recurse divine.* @Autor: Recursion* @Date: ...
- 区间DP例题(持续更新)
区间DP例题(持续更新) 做了这几道题之后发现基本的区间dp其实也就是那回事: 找出状态方程(基本上都长的差不多),然后用递推思维由小区间求得大区间: 可能某些问题会有些其他处理,只需要稍微改下就行了 ...
- 算法学习 区间dp 涂色PAINT
题目链接: 牛客网 涂色PAINT 这是一道区间dp题,题目有小错误,字符串的长度不是5,而是小于1005的长度. 定义:f[i][j] 为区间[i,j]需要涂色最少的次数 我们可以发现这样一件事:我 ...
- 【DP学习总结】区间DP
文章目录 前言 例题 例题[1]石子合并 例题[2]回文子序列 小结 例题[3]环形石子合并(破环成链) 例题[4]多边形 [例题5]String painter 前言 区间dp,顾名思义,是解决一类 ...
- 喵哈哈村的打印机游戏(区间DP)
喵哈哈村的打印机游戏 发布时间: 2017年3月21日 20:00 最后更新: 2017年3月21日 20:02 时间限制: 1000ms 内存限制: 128M 描述 喵哈哈村的月亮同学很 ...
- AtCoder abc256全题解(区间合并模板、矩阵快速幂优化dp、线段树……)
文章目录 A B C-枚举 D-区间合并模板 E-图论建模,函数图的性质 题意 思路 代码 F-树状数组 题意 思路 代码 G-矩阵快速幂优化dp H-线段树 思路 实现 传送门 本文CSDN 本文j ...
最新文章
- 斯坦福的智能马桶能凭肛纹识人,大便和尿液都把你的信息“卖”了……
- ML之kNNC:基于iris莺尾花数据集(PCA处理+三维散点图可视化)利用kNN算法实现分类预测
- mysql的分页查询
- 上个ensp实验只发了配置,这次是命令条目
- 格雷码问题:输出当输入为n时的格雷码
- Linux系统软件包的管理 3月30日课程
- 复合索引字段的排序对搜素的影响
- LSGO软件技术团队2015~2016学年第六周(1005~1011)总结
- django得到Model的全部字段名(field)
- 美团和滴滴会合并吗?投资人回应吃瓜群众的期待
- 从零开始学前端:字体图标的引入 --- 今天你学习了吗?(CSS:Day18)
- https抓包_浅谈HTTPS抓包原理,为什么Charles能够抓取HTTPS报文?
- Dijkstra算法(朴素,堆优化)+例题
- My Firest FireMonkey App
- 冈萨雷斯《数字图像处理》学习笔记(一)绪论
- 微信小程序数据库更新数据说明
- html语言黄色,HTML黄色欧美形式音频工作室网页模板代码
- python opencv 图片缺陷检测!
- 游戏开发人员需要看的书籍
- JavaWeb课程设计——名片管理系统
热门文章
- 误码率matlab怎么计算,PSK理论误码率与实际误码率MATLAB仿真程序(最新整理)
- Python:实现max non adjacent sum最大非相邻和算法(附完整源码)
- bootstrap黑色酷炫IT行业个人博客模板
- 经典语录(个人喜欢)
- mysql 14 关闭休眠链接
- Stefan's Nutch Documentation
- C盘空间不足,释放C盘空间
- 警告: Establishing SSL connection without server
- 一张纸微缩打印多个PowerPoint内容
- 【Android 】零基础到飞升 | ListView简单实用