一双木棋 chess
轮廓线DP,最主要的就是把轮廓给描述出来
这道题目很容易发现一个性质,就是他的轮廓一定是长成阶梯(锯齿)状的
于是我本人想到的一个状态描述就是去描述拐点(也就是计数单增函数的那个模型,比如接下来的数列可以理解为
但是这种状态表示需要判断是否合法,而且转移很麻烦(其实不会,见update)
我们来看看最简单的一种状态
画图之后可以发现每行的棋子数是一个递增序列,即上一行的棋子数一定比下一行多,而且每一行的棋子都是从左往右那么多个,也就是说确定了每一行的棋子数就确定了整个局面,所以关键就是如何简洁地表示一个递增序列
我们可以先写
首先我们先写出
然后看第一行,有四个黑点,于是再第四个
其他行依次类推,最后变成了
于是我们可以发现我们放一个棋子,就是把当前状态的某一个子串
所以代码复杂度要小很多,具体见洛谷
所以以后这种锯齿状的可以考虑这么去描述轮廓
update 2024.7.4
学了离散数学之后,可以知道,判断合法的问题可以固定
转移也很简单,我们假设串是从右往左看的,那么每一个
由于这里阶段不清晰,我们采用记忆化搜索实现,具体见hydrooj的luogu remotejudge代码
update 2024.9.6
其实这道题目作为一个博弈论DP也可以吸收一些东西:就像期望DP一样,我们关心的是当前状态到最终状态的最优值;尽管当前状态下已经放了的棋子可能会导致两者的得分不同,但是我们不关心。之前遇到的博弈论都还没有这个问题,这是唯一一道。由于我们不关心,所以我们可以直接描述轮廓进行DP
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构