练习题5:最大子阵

发布文章 博文管理我的博客退出 Trash Temp ALGO-1 区间k大数查询 ALGO-1 区间k大数查询 ALGO-2 最大最小公倍数 algorithm头文件函数整理 basic–1 basic–1 basic–10 basic–11 basic–13 basic–13 basic–13 basic–2 basic–3 basic–3 basic–4 basic–5 basic–6 basic–7 basic–8 练习题5:最大子阵 人生 人生 人生 人生 人生 人生 人生 人生 给定一个 的矩阵 ,求 中的一个非空子矩阵,使这个子矩阵中的元素和最大。 其中, 的子矩阵指在 中行和列均连续的一部分。 输入格式 输入的第一行包含两个整数 ,分别表示矩阵 的行数和列数。 接下来 行,每行 个整数,表示矩阵 。 输出格式 输出一行,包含一个整数,表示 中最大子矩阵的元素和。 样例输入 3 3 2 -4 1 -1 2 1 4 -2 2 样例输出 6 题解: 矩阵相当于一个二维数组,找最大子阵,可以把二维数组分开来看,把每一行的同一列先加起来,然后求最大子序列的方法一样。 代码: #include #include #include #include <stdio.h> #include <math.h> #define N 500 using namespace std;int dp[200][200];
int A[200][200];int solve(int n, int m)
{
int ans = A[1][1];
//初始化dp数组
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
dp[i][j] = dp[i][j - 1] + A[i][j]; //计算最大子阵
for (int first = 1; first <= m; first++)
{
for (int last = first; last <= m; last++)
{
int max = 0;
for (int i = 1; i <= n; i++)
{
max += dp[i][last] - dp[i][first - 1];
ans = ans > max ? ans : max;
max = max > 0 ? max : 0;//重要,拒绝负子阵。否则有可能会削减最大子阵的值,导致错误结果
}
}
} return ans;
}int main()
{
int m, n;
cin >> n >> m;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
cin >> A[i][j];
cout << solve(n, m) << endl;
return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_43612495/article/details/86365129