Warning: session_start(): open(/tmp/sess_59cf9f98832be92f6da96859ab66da82, O_RDWR) failed: No space left on device (28) in /data/wiki/inc/init.php on line 239

Warning: session_start(): Failed to read session data: files (path: ) in /data/wiki/inc/init.php on line 239

Warning: Cannot modify header information - headers already sent by (output started at /data/wiki/inc/init.php:239) in /data/wiki/inc/auth.php on line 430
Writing /data/wiki/data/cache/d/de2edb2fcb553ea79b79c722a4e13dbc.captchaip failed

Warning: Cannot modify header information - headers already sent by (output started at /data/wiki/inc/init.php:239) in /data/wiki/inc/actions.php on line 38

Warning: Cannot modify header information - headers already sent by (output started at /data/wiki/inc/init.php:239) in /data/wiki/lib/tpl/dokuwiki/main.php on line 12
2023-2024:teams:al_in_and_back_to_whk:23-codeforces-1:l [CVBB ACM Team]

用户工具

站点工具


2023-2024:teams:al_in_and_back_to_whk:23-codeforces-1:l

题面描述

一个长度为 $n$ 的数列 $c$ ,对其赋值为 $0/1$ ,要求 $c_i$ 和 $c_{i+1},c_{i+k}$ 均不能同时为 $1$ 。求所有合法赋值情况下,赋值为 $1$ 的位置的 $w$ 的乘积的和。

$k \le n \le 300$

题解

考虑将序列每行 $k$ 个来变成一个不完整的矩形。这时候我们有两种算法:

第一种:我们考虑直接来轮廓线DP,这样的复杂度是 $O(有效状态数*n)$的。

第二种:我们考虑将其转置一下后再轮廓线DP,但是这时候还需要判断第一行和最后一行之间的合法性,所以复杂度是 $O(有效状态^2*n)$ 的。

这里的有效状态数都是斐波那契级别的,可以近似算作 $O(1.618^len)$,那么第一种的复杂度就是 $O(1.618^k*n)$ ,第二种就是 $O(1.618^{2n/k}*n)$ 。平衡一下复杂度,考虑按照 $2*sqrt{n}$ 为阈值来分开做,算完时间复杂度是正好够的。

后记:我用那个GNU C++17是会超时的,但是换成GNU C++20那个就很轻松的过了(雾)。

2023-2024/teams/al_in_and_back_to_whk/23-codeforces-1/l.1690429982.txt.gz · 最后更改: 2023/07/27 11:53 由 11231123