7.3 CWOI 考试 T1 T2 T3
T1 a
观察大样例发现 \(n = 1\) 与 \(n = 3\) 时相等,猜测 \(n = 2k + 1\) 的答案均相等且 \(n = 2k\) 的答案均相等。
打个暴力拍,发现是对的,所以答案就是 \(n \bmod 2 = 1\) 时进行一次操作,\(n \bmod 2 = 0\) 时进行两次操作的原数组。
T2 b
原题 ABC176F
分讨 DP。
最优化问题,考虑 DP。为什么不是贪心?因为不知道怎么贪。
我们设 \(dp _ {i,x,y}\) 表示前面剩下的为 \(x\) 和 \(y\),考虑 \(a _ {i},a _ {i + 1},a _ {i + 2}\) 的最大答案。可以滚动数组掉第一维。
我们把前两个数单独拿出来,拿去初始化 \(dp\),然后最后会剩下一个直接特判。
然后考虑转移,分两种情况:加分和不加分。以下,\(p = a _ i,q = a _ {i + 1},r = a _ {i + 2}\)
先说加分:
- \(p = q = r\):显然直接取这三个,\(dp _ {i,x,y} = dp _ {i - 1,x,y} + 1\)。
- \(p = q \vee q = r \vee p = r\),以下设 \(p = q\):有两种加分情况:\(x,p,q\),\(x,x,r\),第一种枚举 \(y\),然后 \(dp _ {i,p,y} + 1 \to dp _ {i + 1,r,y}\);第二种没什么说的,\(dp _ {i,r,r} + 1 \to dp _ {i + 1,p,p}\)。
- \(p \neq q \neq r\):三个都可以作为删除的,设 \(r\) 是这个,然后 \(dp _ {i,r,r} + 1 \to dp _ {i + 1,p,q}\)
然后是删除的策略:
- 三个都丢弃:不改变,因为我们用的是滚动数组。
- 丢弃任意两个:我们可以枚举 \(x,y\) 来更新,但是这是 \(\Omicron(n ^ 2)\) 的,更好的方法是记录 \(x\)的最大的 \(dp\) 值,只转移这个,\(y\) 同理,可以做到 \(\Omicron(n)\)
- 丢弃任意一个:转移到 \(dp _ {p,q}\),值是整个 \(dp\) 数组的最大值。
我们可以用一个 vector
来记录需要更新的位置与值,只更新需要更新的,这样就可以做到 \(\Omicron(n ^ 2)\)。
T3 c
原题 CF407D。
抽象 DP + 双指针
发现 \(n \le 400\),所以我们考虑一个 \(\Omicron(n ^ 3)\) 的 DP。
我们设 \(dp _ {l,r,b}\) 表示左边界为 \(l\),右边界为 \(r\),下边界为 \(b\) 的最小的上边界,实现中可以记为上下边界的距离。如果一个 \([l,r]\) 不合法,那要么是 \([l + 1,r]\) 不合法,要么 \([l,r - 1]\) 不合法,要么就是两列合在一起不合法。因此 \(dp _ {l,r,b} = \min \{ dp _ {l + 1,r,b},dp _ {l,r - 1,b},f _ {l,r,b} \}\),后面那个 \(f\) 表示仅考虑 \(l,r\) 两列的 \(b\) 的最小上边界,可以枚举 \(b\) 然后双指针 \(t\) 求出。