题解 [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
参与后面的运算。