CSSYZ 思维训练 R4

发布时间 2023-07-25 11:46:13作者: SSSSSSSSSSoil

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$ )