44. 开发商购买土地
自己写的:
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
const int N = 110;
int n, m;
int q[N][N], s[N][N];
int main()
{
cin >> n >> m;
for (int i = 0; i < n; i ++ )
for (int j = 0; j < m; j ++ ) cin >> q[i][j];
s[0][0] = q[0][0];
for (int i = 1; i < n; i ++ ) s[i][0] = s[i - 1][0] + q[i][0];
for (int j = 1; j < m; j ++ ) s[0][j] = s[0][j - 1] + q[0][j];
for (int i = 1; i < n; i ++ )
for (int j = 1; j < m; j ++ )
s[i][j] = s[i - 1][j] + s[i][j - 1] + q[i][j] - s[i - 1][j - 1];
int result = INT32_MAX;
for (int i = 0; i < n - 1; i ++ )
{
result = min(result, abs(s[n - 1][m - 1] - 2 * s[i][m - 1]));
}
for (int j = 0; j < m - 1; j ++ )
{
result = min(result, abs(s[n - 1][m - 1] - 2 * s[n - 1][j]));
}
cout << result << endl;
return 0;
}
这个是一个二维前缀和的题目。
然后这题给我的一个惨痛的教训就是:
在写for
循环的时候,注意不要把维数搞混了,这题的两维的维数是不同的,行是n,列是m,不要一股脑全写n,特别是针对这种二维维数不同的题目。
补充:
看了下卡哥的题解,卡哥给了两种方案,一种用前缀和(不过是一维前缀和,并不是二维前缀和),一种是在暴力求解的基础上优化一下。
第一种解法:
先将行方向,和列方向的和求出来,这样可以方便知道划分的两个区间的和。
第二种解法:
在暴力求解的基础上,优化一下,就不用前缀和了,在行向遍历的时候,遇到行末尾就统一一下, 在列向遍历的时候,遇到列末尾就统计一下。
附上卡哥题解链接 44. 开发商购买土地
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现