说是暴力解析,真的很像从特殊性质一点点推出正解的过程。

十分搞不清楚这道题为什么要拿部分分(除了 2626),部分分纯粹是给正解写挂的拿的。

子任务编号分值约束做法
S11212T=1T=1,且 1≤n≤201\le n\le 20搜索
S21414所有测试用例中的字符串 ss 均为回文串全输出 00
S32020∑n≤5000\sum n\le 5000比正解还难写的递推转移
S42424所有测试用例均满足 nn 为偶数正解挂掉,没有特判奇数,或者判错了
S53030无额外限制正解

首先,这道题很容易的是 1212 分的暴力做法和 1414 分的输出 00,只需要暴力剪枝。

然后,后面的部分分的作用就是提示你正解了,如果拿完部分分跑路很不划算。

然后第三档需要让你做 n2n^2,先放一下,第四档保证只有偶数,这提示我们正解在奇数的时候会多加一点特判什么的,或者干脆就是奇偶做法不同。这启示我们可以拆分左边和右边。

然后我们可以去想 O(n2)O(n^2) 的做法,我们发现我们可以枚举左边的节点,然后和右边对应的一起满足。可以想到枚举有多少个点被连续选择交换(左边和右边可以看做结合起来了),从之前的转移。

C++
下标: 1 2 3 ... 3 2 1
比如我们到了左边的 3,可以这样:
下标: 1 2 3 ... 3 2 1
         ---
也可以这样:
下标: 1 2 3 ... 3 2 1
         ---       ---

只需要枚举连续的转移次数,然后从之前的状态转移过来就行了。

这时候,如果没有时间了,你有 12+14+20=4612+14+20=46。


正解的话就是把上面的改成 dp,设计状态(我设计的是 fi,0/1/2f_{i,0/1/2}),直接进行转移,甚至比刚刚的东西好写。


所以总结一下,这道题部分分是为了正解设计的,可以根据部分分一步一步写出正解,最好不要拿完部分分就跑。

还有需要注意的是,奇数判错了可以过大样例,但是只有 3838,强烈谴责。(难道部分分就是这样用的?)