You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

90 lines
4.2 KiB

2 years ago
#include <bits/stdc++.h>
using namespace std;
const int N = 1010;
const int INF = 0x3f3f3f3f;
int n; // n行
int m; // m列 
int k; // 区间长度为k
int w[N][N]; // 原矩阵
// 暴力法TLE
// 通过了 4/10个数据
/**
*
* 1a[],b[]
* 2使
* 3C++col,a[],b[]
* 4Krow_mink=3,row_min[5]=2,[3,4,5]2
*/
void get_min(int a[], int b[], int col) {
for (int i = 1; i <= col; i++) { // 枚举每一列
b[i] = INF;
// 找出每个数字包含[自己+前面]共k个范围内的最小值
// j的含义指针从i开始向前倒k个 j∈[i-k+1,i]
// 举栗子i=10,k=2,则应该是[9,10]如果i=1,k=2,则j只能取数值[1]即j>0
for (int j = i; j > max(i - k, 0); j--) b[i] = min(b[i], a[j]);
// 注:这个循环,还是倒序方便些,正序的反倒是代码长度更长
// for (int j = max(i - k + 1, 1); j <= i; j++) b[i] = min(b[i], a[j]);
}
}
void get_max(int a[], int b[], int col) {
for (int i = 1; i <= col; i++) { // 枚举每一列
b[i] = -INF;
for (int j = i; j > max(i - k, 0); j--) b[i] = max(b[i], a[j]);
}
}
int main() {
cin >> n >> m >> k; // n*m矩阵,找出k*k的正方形区域
// 读入
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
cin >> w[i][j];
/*步骤I遍历每一行完成最小值、最大值的向右转储分别记录到row_min、row_max两个数组中。
IIk
*/
int row_min[N][N]; // 最小值
int row_max[N][N]; // 最大值
for (int i = 1; i <= n; i++) {
get_min(w[i], row_min[i], m); // 填充每一行的,k个长度的区间内最小值 保存到row_min数组中, 注意这并不是指某一个最小值而是从k~m的所有长度够k个长度的区间极小值
get_max(w[i], row_max[i], m); // 填充每一行的,k个长度的区间内最大值 保存到row_max数组中, 注意这并不是指某一个最大值而是从k~m的所有长度够k个长度的区间极大值
}
int t[N]; // 列转行,用到的临时中转数组
int a[N]; // 最小值数组
int b[N]; // 最大值数组
/*
II:
(1)row_mint
(2)get_min ta
(3)ak 
(4)row_maxt
(5)get_max tb
(6)bk 
*/
int res = INF; // 预求最小,先设最大
for (int j = k; j <= m; j++) { // 捋着列来
for (int i = 1; i <= n; i++) t[i] = row_min[i][j]; // 同一列的每一行抄出来放到临时数组t中
get_min(t, a, n); // 对t这个临时数组进行求k个范围内的最小值将结果保存到a数组中
for (int i = 1; i <= n; i++) t[i] = row_max[i][j]; // 同一列的每一行抄出来放到临时数组t中
get_max(t, b, n); // 对t这个临时数组进行求k个范围内的最大值将结果保存到b数组中
// 区域最大值-区域最小值注意需要从k开始前面的不够资格
for (int i = k; i <= n; i++) res = min(res, b[i] - a[i]);
}
// 输出
cout << res << endl;
return 0;
}