Algorithm
lc1895_最大的幻方
思路:
由于m,n最大都只有50,所以可以暴力枚举所有可能的幻方,然后找到最大的幻方。O(n^4)也不会超时。
前缀和加倒序优化。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
class Solution {
public:
int largestMagicSquare(vector<vector<int>>& grid) {
int m = grid.size(), n = grid[0].size();
// 预处理前缀和
vector<vector<int>> rowSum(m+1, vector<int>(n+1, 0)); // 行前缀和
vector<vector<int>> colSum(m+1, vector<int>(n+1, 0)); // 列前缀和
for(int i=0; i<m; ++i) {
for(int j=0; j<n; ++j) {
rowSum[i+1][j+1] = rowSum[i+1][j] + grid[i][j];
colSum[i+1][j+1] = colSum[i][j+1] + grid[i][j];
}
}
int maxLen = min(m, n);
for(int len=maxLen; len>=2; --len) { // 从大到小,找到第一个返回
for(int i=0; i<=m-len; ++i) {
for(int j=0; j<=n-len; ++j) {
// 检查以(i,j)为左上角,边长len的幻方
int sum = rowSum[i+1][j+len] - rowSum[i+1][j];
bool ok = true;
// 检查所有行
for(int x=0; x<len; ++x) {
if(rowSum[i+x+1][j+len]-rowSum[i+x+1][j] != sum) {
ok = false; break;
}
}
if(!ok) continue;
// 检查所有列
for(int y=0; y<len; ++y) {
if(colSum[i+len][j+y+1] - colSum[i][j+y+1] != sum) {
ok = false; break;
}
}
if(!ok) continue;
// 检查主对角线
int s1=0, s2=0;
for(int d=0; d<len; ++d) {
s1 += grid[i+d][j+d];
s2 += grid[i+d][j+len-1-d];
}
if(s1==sum && s2==sum) return len;
}
}
}
return 1; // 至少1x1一定是幻方
}
};
|
Review
斯巴达勇士如何培养的【TED】
举国之力的精神和肉体的内卷专制循环筛选,只为了培养战斗战斗战斗…
这是一个系统,有点像军国主义专制的感觉。
Tip
私钥安全,跑在干净mac mini上,vps转发网络请求
很多大佬在思考私钥安全的时候,都是考虑私钥加密放在vps上,然后想着买大厂vps,然后给vps做各种防护。
自己用的一个小技巧则是把私钥放在干净的 mac mini 上,然后把网络请求通过vps转发出去。
- mac mini的好处是安全,同性能配置下更便宜。缺点是如果断电断网,则可用性比vps差点。
- vps则是可用性更好,但是安全性(信任成本)和性能成本更高。
Share-防x-ui爆破
x-ui是有名的x-ray一键安装面板,但是很容易发现x-ui的日志里面有很多的密码爆破的尝试。
自己也有一个节点被爆破成功了,把其中vmess改成了ss协议,导致一致无法访问。
所以有如下几种方式防止x-ui爆破:
- (简单防止,但是无法阻断爆破请求): 修改成复杂的用户名和密码
- (禁用端口,彻底阻断爆破请求): 设置完协议后,直接iptables封掉端口(
iptables -D INPUT -p tcp --dport 433xx -j ACCEPT),等需要修改的时候再添加(iptables -I INPUT 9 -p tcp --dport 433xx -j ACCEPT)
- (根路径hash,大幅减少被爆破的请求概率): 升级使用3x-ui面板,3x-ui默认有个随机的根路径,导致无法直接
ip:port 访问,需要通过根路径访问。