Balanced String

这道题目真的不知道怎么总结了,这技巧太新了

这篇题解

为什么最开始要引入这个子问题呢?实际上,我们假设我们已经得到了最终的交换后的答案,设为ts就是题目给的原串,从st的最小交换次数当然就是从ts的最小交换次数,于是考虑从ts的最小交换次数,发现是s,t不相等的位置的个数

接下来的DP就围绕这个个数做文章。我们抛开题目的交换操作不看,直接构造t:每一个位置可以随便填0/1fi,j,k记录的就是所有长度为i0/1串(一共有2i个),满足所给条件的与si个字符不同的位置的最小个数。然后直接考虑fn,cnt,0(其中cnts0的个数),这个f根据最开始的子问题的分析,就是答案

update 2024.8.28

稍微想了一个简单一点的:假设我们已经获得了最终的答案t,可以发现最小交换次数就是st不同的位置的个数;于是设f[i][j][k]表示对于si个字符,将0改成1的个数减去将1改成0的个数的差为j,"10"减去"01"的个数为k的最小的将0改成1的个数,DP即可;最终答案为f[n][0][0]

但是这里要用滚动数组优化,记住滚动数组每次进入循环都要重新初始化,而且为了不超时,转移的时候一定要加上判断,保证由于转移的状态是上个阶段的合法状态

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