1 条题解

  • 0
    @ 2025-11-4 9:33:45

    题意理解

    已知:

    N×NN \times N 矩阵 B\mathbf{B}

    1×N1 \times N 矩阵 C\mathbf{C}

    要求 1×N1 \times N0101 矩阵 A\mathbf{A},使得 $D = (\mathbf{A} \mathbf{B} - \mathbf{C}) \mathbf{A}^T$ 最大。

    其中 AT\mathbf{A}^TA\mathbf{A} 的转置。

    公式展开

    A=[a1,a2,,aN]\mathbf{A} = [a_1, a_2, \dots, a_N]ai0,1a_i \in {0,1}

    则: $\mathbf{A} \mathbf{B} = \left[ \sum_{i=1}^N a_i B_{i1}, \sum_{i=1}^N a_i B_{i2}, \dots, \sum_{i=1}^N a_i B_{iN} \right]$

    $\mathbf{A} \mathbf{B} - \mathbf{C} = \left[ \sum_{i=1}^N a_i B_{i1} - C_1, \sum_{i=1}^N a_i B_{i2} - C_2, \dots, \sum_{i=1}^N a_i B_{iN} - C_N \right]$

    $D = (\mathbf{A} \mathbf{B} - \mathbf{C}) \mathbf{A}^T = \sum_{j=1}^N a_j \left( \sum_{i=1}^N a_i B_{ij} - C_j \right)$

    即: $D = \sum_{i=1}^N \sum_{j=1}^N a_i a_j B_{ij} - \sum_{j=1}^N a_j C_j$

    问题本质

    这是一个二次无约束 0-1 规划问题: D=i,jaiajBijjajCjD = \sum_{i,j} a_i a_j B_{ij} - \sum_j a_j C_j

    其中 ai0,1a_i \in {0,1}Bij0B_{ij} \geq 0Cj0C_j \geq 0

    算法思路

    由于 N500N \leq 500,直接枚举 2N2^N 不可行。

    代码采用随机化贪心:

    1.初始设所有 ai=1a_i = 1

    2.计算当前 DD 值:

    先计算 dj=i=1NaiBijd_j = \sum_{i=1}^N a_i B_{ij}(即 AB\mathbf{A}\mathbf{B} 的结果)

    再计算 D=j=1Naj(djCj)D = \sum_{j=1}^N a_j (d_j - C_j)

    3.随机翻转某些位(ai1aia_i \leftarrow 1 - a_i

    4.重复 10001000 次,取最大 DD

    复杂度分析

    每次计算 DDO(N2)O(N^2)

    迭代 10001000 次:O(1000×N2)O(1000 \times N^2)

    N=500N = 500 时约为 2.5×1082.5 \times 10^8 操作,可接受

    总结

    本题是二次 0-1 规划问题,由于 NN 较大,采用随机化局部搜索求近似最优解。这种方法在实践中往往能得到不错的结果。

    • 1

    信息

    ID
    4934
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者