uva 108 – Maximum Sum(檢索)

來源:互聯網
上載者:User

題目串連:108 - Maximum Sum


題目大意:對應矩陣的值為矩陣中所有元素的和, 要求所給出的矩陣中, 和最大的子矩陣,輸出最大和。


解題思路:可以看成是求若干次連續序列最大和,第一次求1行,第二次就是1 和2 行對應元素的和的數組,第三次就是1 、 2 和3 行、、、、、、然後知道1 加到n行, 就換2行, 然後是2 + 3 行,以此類推。

注意最大值的初始化不可以是0, 有負數的可能。

#include <stdio.h>#include <string.h>const int N = 105;const int Min = -2147483645;int maxsum(int A[], int x, int y) {    if (y - x == 1) return A[x];    int cur = x + (y - x) / 2;    int a = maxsum(A, x, cur), b = maxsum(A, cur, y);    int Max = a > b ? a : b;    int v = 0, L = A[cur - 1], R = A[cur];    for (int i = cur - 1; i >= x; i--) {v += A[i];L = v > L ? v : L;    }    v = 0;    for (int i = cur; i < y; i++) {v += A[i];R = v > R ? v : R;    }    return Max > R + L ? Max : R + L;}int num[N][N], sum[N];int main() {    int n, Max, total;    while (scanf("%d", &n) == 1) {// Init;Max = Min;memset(num, 0, sizeof(num));    // Read;for (int i = 0; i < n; i++)    for (int j = 0; j < n; j++)scanf("%d", &num[i][j]);// Count;for (int i = 0; i < n; i++) {    memset(sum, 0, sizeof(sum));    for (int j = i; j < n; j++) {for (int k = 0; k < n; k++)    sum[k] += num[j][k];total = maxsum(sum, 0, n);if (total > Max)    Max = total;    }}// Printf;printf("%d\n", Max);    }    return 0;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.