CSSYZ 思维训练 R4
Problem A
题目大意
给出一张只有 0 和 1 的矩阵,可以将 \(k\) 个点反转,求是否可以使这个矩阵中心对称,多测。
算法分析
这题是一个非常经典的贪心策略问题,我们发现,如果一个矩阵中心对称,那么 \(a_{i,j}\) 一定要和 \(a_{n - i + 1,m - j + 1}\) 所以,我们只要求出有几组应该对称的点并没有对称,再判断组数是否小于 \(k\) 如果小于,就输出 YES 否则输出 NO。
复杂度
时间:O( \(n^2t\) )
空间:O( \(n^2t\) )
Problem B
题目大意
在你的面前,有 \(n\) 层台阶,你可以选择发动技能,不消耗体力向上跳 \(1\) 层或 \(2\) 层:你也可以走一层,但是这需要 \(h_i\) 个体力。由于出题人不傻,所以,他让你只能连续发动一次技能。
算法分析
这一题与一道 dp 模板题:爬楼梯高度相似,只是加入了走和跳两种方式,我们只需要开一个状态,表示“上一次是否使用了跳跃”,这样,在下一次继承时,就只继承没跳过的状态即可。
从上面的推导过程我们可以得知:
- dp的状态设计
\(f_{i,0}\) : 跳到第 \(i\) 层,上一次的操作为走。
\(f_{i,1}\) : 跳到第 \(i\) 层,上一次的操作为跳。
- dp的转移方程
\[f_{i,0}=f_{i-1,0}+ f_{i-1,1}
\]
\[f_{i,1}=f_{i-1,0}+ f_{i-2,0}
\]
- dp的边界&初始值
没有边界因为转移方程并不会导向没有值的地方。
初始值是有的,因为这一题是求方案数的dp,所以需要初始化。
我决定把初始值 \(1\) 赋给 \(f_{0,1}\)。这样,\(f_{1,0}\) 就可以读到 \(1\) 了。
- dp取出答案
最后输出时,我们输出几呢?我们发现,不管是上次跳着到终点还是走到终点,都算作到达,所以 \(ans\) 就是:
\[f_{n,0} + f_{n,1}
\]
复杂度
时间:O( \(n\) )
空间:O( \(n\) )

浙公网安备 33010602011771号