题解 [USACO5.1]Musical Themes

这样一道基础 dp 我都做不出了……

开始想的是枚举一个长度,然后再哈希后做一遍 dp,用 map 来记录每个哈希值的答案,时间复杂度是 \(n^2 \log\) 的,本以为能过,然后 T 了。

其实这题求长度,根本不问你这个东西出现了几次,那样子做太浪费了,因为只要出现一次以上就行,所以找到出现两次的记录长度即可。那么 \(f_{i, j}\) 表示出现在 \(i\) 结尾和 \(j\) 结尾的最大重复。 \(f_{i, j} = f_{i-1, j-1} + 1\ [d_i = d_j]\),为了防止交叉,和 \(j-i-1\) 取个 \(\min\) 就可以了。

另外注意在 std::cout 中写三目运算符的时候得打括号,因为 << 优先级高,会先把那玩意儿输出了再把 ostream 强转成 bool 参与后面的运算。

posted @ 2021-07-27 11:40  Acfboy  阅读(22)  评论(0)    收藏  举报