核心逻辑与数学原理
现代 CPU 并不是直接从物理内存(RAM)中读取数据,而是通过由 L1、L2、L3 构成的高速缓存体系(Cache Hierarchy)进行预取。物理内存与 Cache 之间数据交换的最小物理单位是 Cache Line(缓存行),在主流 x86_64 架构下,其大小固定为 $64$ 字节。
当程序试图访问内存地址 $A$ 时,CPU 会触发底层的高速缓存命中校验。若 $A$ 所在的数据块已在 Cache 中,则称为 Cache Hit(缓存命中),延迟仅为几个时钟周期;若不在,则触发 Cache Miss(缓存失效),CPU 必须挂起当前执行流水线,通过总线向物理内存发出读请求,延迟将暴增两个数量级(约 50-200 个时钟周期)。
为了最大化 Cache Hit 概率,CPU 硬件内置了空间局部性(Spatial Locality)预取器:当访问地址 $A$ 时,硬件会自动将物理内存中紧随其后的、凑满一个 Cache Line($64$ 字节)的相邻数据全部拉入缓存。
在 C++ 中,多维数组在物理内存中是以行优先(Row-Major)的方式连续线性展开的。设有一个二维数组 matrix[N][M],其中单个元素大小为 $S$ 字节,其二维坐标 $(i, j)$ 映射到一维物理内存地址 $\text{Addr}(i, j)$ 的数学公式为:
@@@MATH_BLOCK8@@@C[i][j] = \min{k=1}^{V} {A[i][k] + B[k][j]}@@@MATH_BLOCK9@@@dp[i][S] = \min{S' \subset S} {dp[i-1][S \setminus S'] + \text{cost}(S', S \setminus S')}$$
由于子集枚举复杂度为 $O(3^N)$,配合深度维度后总常数极大。如果将数组声明为 dp[13][1<<12],最内层枚举二进制状态 $S$ 时,右侧维度的二进制内存地址呈完美线性增长,极高地提升了高速缓存的命中率,是这道题在 NOIP 评测机上不加剪枝也能强行卡时限通过的关键底层黑魔法。