洛谷P2216 理想的正方形
题目
有可以直接找为为左下角长度为t的正方形内的最大值。
然后可以有以下转移:
然后考虑滚动数组,最后答案直接枚举即可。
#include <bits/stdc++.h>
#define N 1011
using namespace std;
int n, m, k, ans = 2147483647;
int a[N][N], sum[N][N], minn[N][N], maxn[N][N];//maxn[i][j]表示以i,j为左下角的矩阵最大值。
int Max(int a, int b, int c, int d)
{
return max(max(a, b), max(c, d));
}
int Min(int a, int b, int c, int d)
{
return min(min(a, b), min(c, d));
}
inline void init()
{ //maxn[i][j][k]以i,j为左下角的长度为(1 << k)的矩阵最大值
scanf("%d%d%d", &n, &m, &k);
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
{
scanf("%d", &a[i][j]);
maxn[i][j] = a[i][j], minn[i][j] = a[i][j];
}
for (int t = 2; t <= k; t++)//t是区间长度
for (int i = 1; i + 1 <= n; i++)
for (int j = 1; j + 1 <= m; j++)
{
maxn[i][j] = Max(maxn[i + 1][j], maxn[i][j], maxn[i][j + 1], maxn[i + 1][j + 1]);
minn[i][j] = Min(minn[i + 1][j], minn[i][j], minn[i][j + 1], minn[i + 1][j + 1]);
}
}
int main()
{
// freopen("ha.in", "r", stdin);
init();
for (int i = 1; i + k - 1 <= n; i++)
for (int j = 1; j + k - 1 <= m; j++)
ans = min(ans, maxn[i][j] - minn[i][j]);
printf("%d", ans);
return 0;
}
/*
5 4 2
1 2 5 6
0 17 16 0
16 17 2 1
2 10 2 1
1 2 2 2
*/
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 继承的思维:从思维模式到架构设计的深度解析
· 如何在 .NET 中 使用 ANTLR4
· 后端思维之高并发处理方案
· 理解Rust引用及其生命周期标识(下)
· 从二进制到误差:逐行拆解C语言浮点运算中的4008175468544之谜
· Cursor预测程序员行业倒计时:CTO应做好50%裁员计划
· 想让你多爱自己一些的开源计时器
· 大模型 Token 究竟是啥:图解大模型Token
· 用99元买的服务器搭一套CI/CD系统
· 当职场成战场:降职、阴谋与一场硬碰硬的抗争
2018-10-29 乘法逆元