CSSYZ 思维训练 R4

Problem A

题目大意

给出一张只有 01 的矩阵,可以将 \(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 模板题:爬楼梯高度相似,只是加入了走和跳两种方式,我们只需要开一个状态,表示“上一次是否使用了跳跃”,这样,在下一次继承时,就只继承没跳过的状态即可。

从上面的推导过程我们可以得知:

  1. dp的状态设计

\(f_{i,0}\) : 跳到第 \(i\) 层,上一次的操作为走。

\(f_{i,1}\) : 跳到第 \(i\) 层,上一次的操作为跳。

  1. dp的转移方程

\[f_{i,0}=f_{i-1,0}+ f_{i-1,1} \]

\[f_{i,1}=f_{i-1,0}+ f_{i-2,0} \]

  1. dp的边界&初始值

没有边界因为转移方程并不会导向没有值的地方。

初始值是有的,因为这一题是求方案数的dp,所以需要初始化。

我决定把初始值 \(1\) 赋给 \(f_{0,1}\)。这样,\(f_{1,0}\) 就可以读到 \(1\) 了。

  1. dp取出答案

最后输出时,我们输出几呢?我们发现,不管是上次跳着到终点还是走到终点,都算作到达,所以 \(ans\) 就是:

\[f_{n,0} + f_{n,1} \]

复杂度

时间:O( \(n\) )

空间:O( \(n\) )

posted @ 2023-07-25 11:39  SSSSSSSSSSoil  阅读(50)  评论(0)    收藏  举报