题目链接(洛谷)
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模板)相关推荐

  1. CodeForces - 1312E Array Shrinking(区间dp)(通俗易懂)

    CodeForces - 1312E Array Shrinking(区间dp) 题目链接: 没做出来,看了一下别人的题解,才A掉.但网上没发现一篇讲得比较易懂的题解,所以就准备写一篇再加上我自己的理 ...

  2. CodeForces - 1312E Array Shrinking(区间dp)

    题目链接:点击查看 题目大意:给出 n 个数,现在可执行的操作是: 找到相邻且数值相等的两个数,即 abs( i - j ) == 1 && a[ i ] == a[ j ] 使得两个 ...

  3. 【动态规划dp】区间DP模板 Acwing 282. 石子合并 | P3205 [HNOI2010]合唱队

    区间DP 模板 282. 石子合并 #include<iostream> #include<cmath> #include<algorithm> #include& ...

  4. [CF1312E]Array Shrinking

    题目 传送门 to luogu 题意概要 一维线段上的 2048 \tt 2048 2048 游戏:每次两个相邻 x x x 可以合并成 x + 1 x+1 x+1 .求最少能剩下几个数字. 数据范围 ...

  5. P1775 石子合并(弱化版)(区间dp模板)

    石子合并(弱化版) - 洛谷 /** @Description: To iterate is human, to recurse divine.* @Autor: Recursion* @Date: ...

  6. 区间DP例题(持续更新)

    区间DP例题(持续更新) 做了这几道题之后发现基本的区间dp其实也就是那回事: 找出状态方程(基本上都长的差不多),然后用递推思维由小区间求得大区间: 可能某些问题会有些其他处理,只需要稍微改下就行了 ...

  7. 算法学习 区间dp 涂色PAINT

    题目链接: 牛客网 涂色PAINT 这是一道区间dp题,题目有小错误,字符串的长度不是5,而是小于1005的长度. 定义:f[i][j] 为区间[i,j]需要涂色最少的次数 我们可以发现这样一件事:我 ...

  8. 【DP学习总结】区间DP

    文章目录 前言 例题 例题[1]石子合并 例题[2]回文子序列 小结 例题[3]环形石子合并(破环成链) 例题[4]多边形 [例题5]String painter 前言 区间dp,顾名思义,是解决一类 ...

  9. 喵哈哈村的打印机游戏(区间DP)

    喵哈哈村的打印机游戏 发布时间: 2017年3月21日 20:00   最后更新: 2017年3月21日 20:02   时间限制: 1000ms   内存限制: 128M 描述 喵哈哈村的月亮同学很 ...

  10. AtCoder abc256全题解(区间合并模板、矩阵快速幂优化dp、线段树……)

    文章目录 A B C-枚举 D-区间合并模板 E-图论建模,函数图的性质 题意 思路 代码 F-树状数组 题意 思路 代码 G-矩阵快速幂优化dp H-线段树 思路 实现 传送门 本文CSDN 本文j ...

最新文章

  1. 斯坦福的智能马桶能凭肛纹识人,大便和尿液都把你的信息“卖”了……
  2. ML之kNNC:基于iris莺尾花数据集(PCA处理+三维散点图可视化)利用kNN算法实现分类预测
  3. mysql的分页查询
  4. 上个ensp实验只发了配置,这次是命令条目
  5. 格雷码问题:输出当输入为n时的格雷码
  6. Linux系统软件包的管理   3月30日课程
  7. 复合索引字段的排序对搜素的影响
  8. LSGO软件技术团队2015~2016学年第六周(1005~1011)总结
  9. django得到Model的全部字段名(field)
  10. 美团和滴滴会合并吗?投资人回应吃瓜群众的期待
  11. 从零开始学前端:字体图标的引入 --- 今天你学习了吗?(CSS:Day18)
  12. https抓包_浅谈HTTPS抓包原理,为什么Charles能够抓取HTTPS报文?
  13. Dijkstra算法(朴素,堆优化)+例题
  14. My Firest FireMonkey App
  15. 冈萨雷斯《数字图像处理》学习笔记(一)绪论
  16. 微信小程序数据库更新数据说明
  17. html语言黄色,HTML黄色欧美形式音频工作室网页模板代码
  18. python opencv 图片缺陷检测!
  19. 游戏开发人员需要看的书籍
  20. JavaWeb课程设计——名片管理系统

热门文章

  1. 误码率matlab怎么计算,PSK理论误码率与实际误码率MATLAB仿真程序(最新整理)
  2. Python:实现max non adjacent sum最大非相邻和算法(附完整源码)
  3. bootstrap黑色酷炫IT行业个人博客模板
  4. 经典语录(个人喜欢)
  5. mysql 14 关闭休眠链接
  6. Stefan's Nutch Documentation
  7. C盘空间不足,释放C盘空间
  8. 警告: Establishing SSL connection without server
  9. 一张纸微缩打印多个PowerPoint内容
  10. 【Android 】零基础到飞升 | ListView简单实用