日常记录

📅 2026/7/15 12:43:44 👁️ 阅读次数 📝 编程学习
日常记录

5.10

原题

给定一个n*n的二维整数a数组,从起始坐标sx,sy出发行走m次(每次行走为走到当前格的上下左右格),求经过格子中数总和的最大值(重复经过算一次)。
走之前可以进行至多一次操作,将一个任意大小的正方形区域顺时针或逆时针旋转90度。
输入要求:
第一行四个整数n,m,sx,sy
接下来n行,每行n个整数,代表a[i]行
输出要求:
一个整数,代表经过格子中数总和的最大值。
2<=n<=1000,1<=m<=5

首先注意到m很小,所以尽管理论上它np但我们假装它不np。

shumu大佬思路:

因为 \(m \ge 5\),先枚举所有至多 \(4^m\) 条路径,再枚举 \(O(n^2)\) 个旋转中心;对固定中心,路径涉及的格子数是常数,只需按这些格子到中心的距离枚举关键正方形半径并计算顺/逆时针旋转后的路径权值,所以总时间复杂度为 \(O(4^m·m^2⋅n^2)\).

理解:关键半径即每个路径格子到中心的切比雪夫距离(好高端的名字a),因为如果路径更大也不影响,旋转得到的新值不变,就把枚举 \(n\) 次半径优化到 \(m\) 了。

@zmdayo 真的假的???

补充一点,旋转最多用一次

话说旋转无限次的话满足什么条件是不是只需要找网格前 \(m+1\) 大的值总和就行?那样或许能诈骗。

5.13

algorithm 库中有 max({})

5.17

结构体初始化一定要用构造函数,像

struct node{int a=1,b=2,...;
};

绝对会炸掉。本地编译贼慢,OJ Nothing is compiled: OUTPUT exceeds. 不清楚原理