| 题目名称 | 111. [NOIP 2005]过河 |
|---|---|
| 输入输出 | river.in/out |
| 难度等级 | ★★★ |
| 时间限制 | 1000 ms (1 s) |
| 内存限制 | 128 MiB |
| 测试数据 | 10 |
| 题目来源 |
|
| 开放分组 | 全部用户 |
| 提交状态 | |
| 分类标签 | |
| 查看题解 | 分享题解 |
| 通过:332, 提交:1368, 通过率:24.27% | ||||
|
|
100 | 0.000 s | 0.00 MiB | C++ |
|
|
100 | 0.000 s | 0.00 MiB | C++ |
|
|
100 | 0.000 s | 0.00 MiB | C++ |
|
|
100 | 0.000 s | 0.00 MiB | C++ |
|
|
100 | 0.000 s | 0.00 MiB | C++ |
|
|
100 | 0.000 s | 0.00 MiB | C++ |
|
|
100 | 0.000 s | 0.00 MiB | C++ |
|
|
100 | 0.000 s | 0.00 MiB | C++ |
|
|
100 | 0.000 s | 0.00 MiB | C++ |
|
|
100 | 0.000 s | 0.00 MiB | C++ |
| 本题关联比赛 | |||
| 防止颓废的小练习v0.4 | |||
| 假期找点事儿做题吧 | |||
| ctime蒟蒻生日赛 | |||
| 状态压缩DP | |||
| 状态压缩DP练习 | |||
| 关于 过河 的近10条评论(全部评论) | ||||
|---|---|---|---|---|
|
既然超过 \(S \cdot T\) 的空地不会改变青蛙的“记忆模式”,我们就可以把任意长的空地**缩短成 \(S \cdot T\)**,而不影响最终答案。
例如,若石子在 100 和 10000 处,中间 9900 格全是空的,我们只需保留 90 格(因 \(S,T \leq 10\),取 \(10 \times 9 = 90\))。压缩后,DP 状态空间大小从 \(L\)(可能 10⁹)降到约 \(100 \times 90 = 9000\),计算可行。**这个 \(S \cdot T\) 就是保证状态“线性无关组已完备”的临界长度**。
2025-10-23 22:55
31楼
| ||||
|
假设两块石子之间全是空地,距离为 \(d\)。青蛙能跳 \(S, S+1, \dots, T\) 格。数学上可以证明:只要 \(d > S \cdot T\),青蛙就能通过不同跳法,**落到这段空地之后的任意“相对位置”**(比如刚好对齐某个余数)。
这是因为步长集合能“生成”所有足够大的数(因 \(\gcd=1\)),而 \(S \cdot T\) 是最坏情况下需要的最小长度(来自 Frobenius 问题)。此时,状态向量 \(\mathbf{v}_x\) 已经遍历了所有可能的组合,**新增的空地不会带来新信息**——就像背完乘法表后,再背也是重复。
2025-10-23 22:54
30楼
| ||||
|
青蛙跳到位置 \(x\) 时,最少踩多少石子,只和它**前 \(T\) 步**的情况有关(因为最多跳 \(T\) 格)。我们可以把这 \(T\) 个值写成一个“状态向量”:
\[ \mathbf{v}_x = \begin{bmatrix} f(x-T+1) \\ f(x-T+2) \\ \vdots \\ f(x) \end{bmatrix} \] 这个向量就像青蛙的“记忆”,长度固定为 \(T\)。所以,不管桥多长,所有可能的“记忆”最多只有 \(T\) 个独立方向——这叫**状态空间维度不超过 \(T\)**。一旦走过一段很长的空地,这些“记忆”就会开始重复。
2025-10-23 22:54
29楼
| ||||
|
以下内容是根据陈老师讲的后增加的自我总结的内容
2025-10-23 22:54
28楼
| ||||
|
500分留念
感谢小青蛙给一个机会 题解已发布 | ||||
|
小凯的疑惑
当s=9,t=10; 互质; 最小不可拼出的为s*t-s-t; 即71; | ||||
|
2520压缩法。。
| ||||
|
我傻。
| ||||
|
第一发状态压缩动态规划
| ||||
|
我只说,小心压缩两个石头到同一位置。。。
| ||||
在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧。在桥上有一些石子,青蛙很讨厌踩在这些石子上。由于桥的长度和青蛙一次跳过的距离都是正整 数,我们可以把独木桥上青蛙可能到达的点看成数轴上的一串整点: $0,1,\cdots,L$(其中 $L$ 是桥的长度)。坐标为 $0$ 的点表示桥的起点,坐标为 $L$ 的点表示桥的终点。青蛙从桥的起点开始,不停的向终点方向跳跃。一次跳跃的距离是 $S$ 到 $T$ 之间的任意正整数(包括 $S,T$ )。当青蛙跳到或跳过坐标为 $L$ 的点时,就算青蛙已经跳出了独木桥。
题目给出独木桥的长度 $L$ ,青蛙跳跃的距离范围 $S,T$ ,桥上石子的位置。你的任务是确定青蛙要想过河,最少需要踩到的石子数。
输入文件的第一行有一个正整数 $L(1\leq L\leq 10^9)$,表示独木桥的长度。第二行有三个正整数 $S,T,M$ ,分别表示青蛙一次跳跃的最小距离,最大距离,及桥上石子的个数,其中 $1\leq S\leq T\leq 10,1\leq M\leq 100$ 。第三行有 $M$ 个不同的正整数分别表示这 $M$ 个石子在数轴上的位置(数据保证桥的起点和终点处没有石子)。所有相邻的整数之间用一个空格隔开。
输出文件只包括一个整数,表示青蛙过河最少需要踩到的石子数。
10 2 3 5 2 3 5 6 7
2
对于30%的数据,$L\leq 10000$;
对于全部的数据,$L\leq 10^9$。