248 G

其实这道题目严格证明不丢失答案还是有点难度的

按照常规做法,我们设f[l][r]表示区间[l,r]的最佳答案

但是我们发现这道题目不能像石子合并这样转移,因为他必须要求值一样的才能合并

所以我们可以仿照消木块这道题目,想一想两个端点如何消去

如果左端点不参与形成最终答案,则f[l][r]=f[l+1][r]

如果右端点不参与形成最终答案,则f[l][r]=f[l][r1]

如果两个端点都要参与形成最终答案,此时可以知道最终答案一定只有一个数(即这个区间所有数都参与合并了,否则左右两个端点不能相邻,就别说一起参与合并了),所以我们枚举分段点,如果某一时刻有f[i][k]==f[k+1][j],则有转移f[i][j]=max(f[i][j],f[i][k]+1)

以上好像是错的,我也不知道怎么严格证明区间DP的正确性

就算是另一种方程表示我也不懂,为啥一定要右端点最大啊

update 2024.6.29

上面给出的区间DP肯定是错的,因为如果要讨论左右端点是否参与形成答案,就是说f[i][j]所代表的区间可以不用合成一个数的(最终结果可能还存在许多个数),所以枚举中间分段点的操作是错误的

然而题解给的区间DP的状态代表的是区间[l,r]合并成一个数所能得到的最大值,但是不知道为什么枚举分段点的时候只用判断两个子区间合并的最大值是否相等就可以转移了,万一两个区间可以合并出不是最大值但是相等的数,那么不是还可以合并吗?

然后可以看一下加强版

那么这道题目就要求我们用另一种DP了,然而另一种DP仍然只存了一个位置(比如说,从位置i开始合并出值j的右端点,为什么第一次一定要合并到f[i][j1]呢?我不能合并到其他端点,但是仍然合并出值j1吗),也不知道为什么是正确的

posted @   最爱丁珰  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示