北京大学 最大子矩阵 需要二刷 *DP高维最大连续和问题

基本思想:

隐藏下的最大连续数和的问题,不容易看出来,从矩阵的性质中才可能看出来。

自己最初是想用二维DP来标识0-x,0-y的矩阵,但是发现不能表示非0起点的最大矩阵和;

一些大佬的思想是通过多行合并来计算,例如1-3行合并,则是找3*n的最大子矩阵,可以通过一次最长连续和求解,这个第一次见;

关键点:

无;

#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
using namespace std;

const int maxn = 108;
int n;
int ma[maxn][maxn];
int dp[maxn];
int buf[maxn];
int Max = -129;

void findMax() {
    dp[0] = buf[0];
    for (int i = 1; i < n; i++) {
        if (buf[i] + dp[i - 1] > buf[i]) {
            dp[i] = buf[i] + dp[i - 1];
        }
        else {
            dp[i] = buf[i];
        }
    }
    sort(dp, dp + n);
    if (Max < dp[n - 1])
        Max = dp[n - 1];
}

int main() {
    while (cin >> n) {
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                cin >> ma[i][j];
            }
        }
        for (int k = 0; k < n; k++) {
            for (int v = 0; v < n; v++) {
                buf[v] = ma[k][v];
            }
            findMax();
            for (int i = k+1; i < n; i++) {
                for (int j = 0; j < n; j++) {
                    buf[j] += ma[i][j];
                }
                findMax();
            }
        }
        cout << Max << endl;
    }
}

猜你喜欢

转载自www.cnblogs.com/songlinxuan/p/12614345.html