《算法竞赛-训练指南》第一章-1.24_pre二维矩阵中的最小连续矩阵和

来源:互联网 发布:幸运抽奖软件作弊 编辑:程序博客网 时间:2024/06/05 14:26

从一维数组拓展到二维矩阵这是个奇妙的过程……

二维矩阵的求法还是用一维数组的求法,就是任意枚举两行,然后求出这两行之间的同一列的元素的和,然后利用一维数组的求法,求出最大连续和,就是当前枚举的最大子矩阵和。

当然思想是好想,实现起来呢,也是好实现的,就是我受了题解上面的那个sum[x][y]的迷惑,一直都不知道怎么用,也想着怎么这利用上去,但是用来用去也没用成。总算用上了,发现时间效率和枚举的时候顺便求出和的效率差不多。

贴出代码:

#include <stdio.h>#include <string.h>#include <iostream>#include <string>using namespace std;const int MAXN = 10;const int INF = 1 << 30;int N;int M;int A[MAXN][MAXN];int S[MAXN][MAXN];int C[MAXN];int T[MAXN];int maxSum(int n, int *B){for (int i = 1; i <= n; i++){T[i] = B[i] - B[i - 1];}int ans = 0;int sum = T[1];for (int i = 2; i <= n; i++){if (sum > 0){sum += T[i];}else{sum = T[i];}if (ans < sum){ans = sum;}}return ans;}int main(){while (scanf("%d%d", &N, &M) != EOF){memset(S, 0, sizeof(S));for (int i = 1; i <= N; i++){for (int j = 1; j <= M; j++){scanf("%d", &A[i][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] - S[i - 1][j - 1] + A[i][j];}}int sum = -INF;for (int i = 1; i <= N; i++){for (int j = i; j <= N; j++){C[0] = 0;for (int k = 1; k <= M; k++){C[k] = S[j][k] - S[i - 1][k];}int ans = maxSum(M, C);if (ans > sum){sum = ans;}}}/*for (int i = 1; i <= N; i++){memset(C, 0, sizeof(C));for (int j = i; j <= N; j++){C[0] = 0;for (int k = 1; k <= M; k++){C[k] += A[j][k];}int ans = maxSum(M, C);if (ans > sum){sum = ans;}}} //这种写法也是可以的相当于枚举列的时候顺便把sum也求了出来. */printf("%d\n", sum);}system("pause");return 0;}


原创粉丝点击