说是暴力解析,真的很像从特殊性质一点点推出正解的过程。
十分搞不清楚这道题为什么要拿部分分(除了 ),部分分纯粹是给正解写挂的拿的。
| 子任务编号 | 分值 | 约束 | 做法 |
|---|---|---|---|
| S1 | ,且 | 搜索 | |
| S2 | 所有测试用例中的字符串 均为回文串 | 全输出 | |
| S3 | 比正解还难写的递推转移 | ||
| S4 | 所有测试用例均满足 为偶数 | 正解挂掉,没有特判奇数,或者判错了 | |
| S5 | 无额外限制 | 正解 |
首先,这道题很容易的是 分的暴力做法和 分的输出 ,只需要暴力剪枝。
然后,后面的部分分的作用就是提示你正解了,如果拿完部分分跑路很不划算。
然后第三档需要让你做 ,先放一下,第四档保证只有偶数,这提示我们正解在奇数的时候会多加一点特判什么的,或者干脆就是奇偶做法不同。这启示我们可以拆分左边和右边。
然后我们可以去想 的做法,我们发现我们可以枚举左边的节点,然后和右边对应的一起满足。可以想到枚举有多少个点被连续选择交换(左边和右边可以看做结合起来了),从之前的转移。
C++
下标: 1 2 3 ... 3 2 1
比如我们到了左边的 3,可以这样:
下标: 1 2 3 ... 3 2 1
---
也可以这样:
下标: 1 2 3 ... 3 2 1
--- ---
只需要枚举连续的转移次数,然后从之前的状态转移过来就行了。
这时候,如果没有时间了,你有 。
正解的话就是把上面的改成 dp,设计状态(我设计的是 ),直接进行转移,甚至比刚刚的东西好写。
所以总结一下,这道题部分分是为了正解设计的,可以根据部分分一步一步写出正解,最好不要拿完部分分就跑。
还有需要注意的是,奇数判错了可以过大样例,但是只有 ,强烈谴责。(难道部分分就是这样用的?)