8.11 格路计数与乐子题

发布时间 2023-08-12 09:26:46作者: _maze

邮戳拉力赛

好题啊!

写了一个错误的解,但仍未知道错在哪里。

容易发现路径一定是:向上走,到一个点后向下走,走到一个点后再向上走,以此类推。

往下走时,可以自由选择是下行时盖章还是上行时盖章,这也是一直往上走不最优的理由。

\(0\) 向上走到 \(n+1\) 的路径长度可以最后再加,不用考虑。那么我们得到的是一段一段的区间,区间的贡献需要特殊计算。

区间是这么产生的:首先从上行车站转到下行车站,往前走一段后再从下行车站转到上行车站。这实际上就是一对括号。括号有着很好的性质,我们可以用 dp 求解。

\(f_{i,j}\) 表示当前转移到 \(i\),有 \(j\) 个左括号尚未匹配。那么容易从 \(f_{i - 1}\) 转移。

但是还没完。样例一告诉我们可以有多个括号在同一个格子。因此我们还要从自身转移。但这也是不难的,因为这就是一个完全背包。从小到大依次转移即可。

JOIOJI

给你一长度为 \(n\),只包含 J,O,I 三个字母的字符串,求最大长度的子串,使子串中 J,O,I 三个字符出现次数相同

思考只有两个字母时怎么做。一个经典的转换是把其中一个视为 \(1\),另一个视为 \(-1\),那么符合要求的子串和应该为 \(0\)。在实现中,子串和相同就是前缀和相同。

扩展到三个字母也一样。用 map 记录 J,OO,I 的前缀和组成的一对,如果这一对前缀和都相同即为 J,O,I 三者出现次数相同,然后把最左端的与最右端匹配即可。

INFORMACIJE

乐子题,匈牙利算法只清空一边 WA 一发,警钟长鸣。

由于 \(n\) 只有两百,考虑一些暴力的做法。比如,我们对每个点可能赋成哪些值与这个点连边,然后跑二分图匹配。

这样是错的!我们无法保证最大最小值在要求的区间中出现。于是我们必须禁止其他的点选到这个值,然后就过了。

匈牙利算法只清空一边 WA 一发,警钟长鸣。