You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

n阶整数网格最优分割线求解算法的性能优化问询

最优直线边界求解性能优化

问题描述

给定n×n的整数网格,需绘制一条贯穿网格的直线,使包含左上角的区域数值总和最大。判定规则如下:

  • 若方格中心位于直线上方或直线上,则该方格计入求和区域(上方指包含网格左上角的一侧)
  • 直线不能恰好从左上角出发
  • 直线需从网格一侧延伸至另一侧,起点和终点可位于边线上任意位置,不限于整数点

现有实现代码

import numpy as np
import fractions

def best_line(grid):
    n, m = grid.shape
    D = [(di, dj) for di in range(-(n - 1), n) for dj in range(-(n - 1), n)]
    def slope(d):
        di, dj = d
        if dj == 0:
            return float('inf') if di <= 0 else float('-inf'), -di
        else:
            return fractions.Fraction(di, dj), fractions.Fraction(-1, dj)
    D.sort(key=slope)
    D = np.array(D, dtype=np.int64)
    s_max = grid.sum()
    for grid in (grid, grid.T):
        left_sum = 0
        for j in range(grid.shape[1]):
            left_sum += grid[:,j].sum()
            for i in range(grid.shape[0]):
                p = np.array([i, j], dtype=np.int64)
                Q = p + D
                Q = Q[np.all((0 <= Q) & (Q < np.array(grid.shape)), axis=1)]
                s = left_sum 
                for q in Q:
                    if not np.any(q):
                        break
                    if q[1] <= j:
                        s -= grid[q[0],q[1]]
                    else:
                        s += grid[q[0],q[1]]
                    s_max = max(s_max, s)
    return s_max

性能现状

当前代码在n=30时运行缓慢,耗时约1分55秒得到结果57。已有并行优化版本将n=250的运行时间缩短至1分05秒,现寻求进一步的性能加速方案。

测试用例

  • 全正整数网格:最优直线为包含整个网格的直线;全负整数网格:最优直线为排除所有网格的直线。
  • 能清晰分离负整数与非负整数的直线为较优解。
  • 示例1(最优值14):
[[ 3 -1 -2 -1]
 [ 0  1 -1  1]
 [ 1  1  3  0]
 [ 3  3 -1 -1]]
  • 示例2(最优值0):
[[-3 -3  2 -3]
 [ 0 -2 -1  0]
 [ 1  0  2  0]
 [-1 -2  1 -1]]
  • 示例3(最优值31):
[[ 3  0  1  3 -1  1  1  3 -2 -1]
 [ 3 -1 -1  1  0 -1  2  1 -2  0]
 [ 2  2 -2  0  1 -3  0 -2  2  1]
 [ 0 -3 -3 -1 -1  3 -2  0  0  3]
 [ 2  2  3  2 -1  0  3  0 -3 -1]
 [ 1 -1  3  1 -3  3 -2  0 -3  0]
 [ 2 -2 -2 -3 -2  1 -2  0  0  3]
 [ 0  3  0  1  3 -1  2 -3  0 -2]
 [ 0 -2  2  2  2 -2  0  2  1  3]
 [-2 -2  0 -2 -2  2  0  2  3  3]]

测试矩阵生成代码

可通过以下代码生成更多随机测试矩阵:

import numpy as np
N = 30
square = np.random.randint(-3, 4, size=(N, N))

内容的提问来源于stack exchange,提问作者Simd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 14:44:53