[CSP-S 2024] 染色

CCF在CSP卡常我是没想到的

一眼DP,尝试设fi表示前i个的最大价值,假设在i前面第一个涂与i相同颜色的方块是j,就会发现[j+1,i1]的价值没办法确定,主要是j+1的价值没办法确定。此时的情形是jj+1的颜色不同,于是可以加维设f[i][0/1]表示前i个的最大价值,其中ii1的颜色相同/不同,于是有

f[i][0]=max(f[i1][0],f[i1][1])+{0if a[i]a[i1]a[i]if a[i]=a[i1]

f[i][1]=maxj<i1(f[j+1][1]+val(j+2,i1)+{0if a[i]a[j]a[i]if a[i]=a[j])

,其中val(i,j)表示[i1,j]是相同颜色,[i,j]的总贡献.这个用前缀和处理就好了,即val(i,j)=sumjsumi1,于是有

f[i][1]=maxj<i1(f[j+1][1]sumj+1+{0if a[i]a[j]a[i]if a[i]=a[j])+sumi1

对于这个式子,不难以a[i]为下标建立线段树找最大值,然后实现O(TnlogV)的复杂度
可惜,CCF这次卡常,而且我优化不掉,于是只能使用其他技巧
想一下,我们现在要干的事是找出[1,a[i]1][a[i]+1,V]中的最大值,以及a[i]的DP值加上a[i].如果我们直接找[1,V]的最大值,那么显然那可以O(1)时间,但是如果找出来的地方是a[i]呢?其实不影响,因为此时一定有f[j+1][1]sumj+1+a[i]>f[j+1][1]sumj+1

这个优化以前没见过,的确可以看一下

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