POJ 1050 最大子矩陣和

2021-08-28 03:33:03 字數 1158 閱讀 4861

題意:有乙個包含正數和負數的二維陣列。乙個子矩陣是指在該二維陣列裡,任意相鄰的下標是1×1或更大的子陣列。乙個子矩陣的和是指該子矩陣中所有元素的和。

思路:首先需要會一維的最大子串行和

把該問題轉化為最大連續子串和問題,即二維轉化為一維。假設求出的最大子矩陣為從x行到y行,從第c列到第r列,則該矩陣轉化為一維即是從第1列到第n列的所有x行到第y行的元素和的最大連續子串和。這樣後,複雜度為n的三次方,在求最大連續子串和的時候用dp就可以了。

#include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define eps 1e-8

#define inf 0x3f3f3f3f

#define pi acos(-1)

#define lson l,mid,rt<<1

#define rson mid+1,r,(rt<<1)+1

#define clr(x,y) memset((x),y,sizeof(x))

#define ****(x) cerr << #x << "=" << x << endl

using

namespace

std;

typedef

long

long ll;

typedef

unsigned

long

long ull;

const

int seed = 131;

const

int maxn = 1e5 + 5;

const

int mod = 998244353;

int a[105][105];//原陣列

int b[105];//累加陣列

int main()

}int max = -inf;

for (int i = 1; i <= n; i++) }}

printf("%d\n", max);

return

0;}

poj1050 (最大子矩陣和)

首先要熟悉一下最大子段和 即最大連續子串的和 給一串數字,找到最大子段和的值。一般方法是dp,dp i 表示以a i 為結尾的最大子段和,那麼dp i max dp i 1 a i a i 即,當dp i 1 0時,dp i a i 否則dp i dp i 1 a i 有了一維的基礎,現在來看看矩陣...

poj1050最大子矩陣和

這篇是看了別人的報告寫的,就當是屢屢思路好了.題目大意。給定乙個n階矩陣 方陣 每個元素中存在乙個數字.任務就是求出乙個最大的子矩陣使得矩陣元素之間的和是最大的.n 100 1.矩陣a m n 的和可以直接 sum a i j i 0 to n 1 j 0 to n 1 還可以求出第i列的和p i ...

poj 1050 最大子矩陣和

最大子矩陣和的方法和最大欄位和一樣 先單獨對每行求最大欄位和 此時,子矩陣的行為1,就是最大欄位和了 然後,把第i行後的各行對應列的元素加到第i行的對應列元素,每加一行,就求一次最大欄位和,這樣就把子矩陣的多行壓縮為一行了,一行了就是最大欄位和了 也可以這樣理解 a11 a12 a13 a21 a2...