SCU4400最大子陣題解(dp)

2022-09-06 08:51:08 字數 1345 閱讀 8571

給定乙個n*m的矩陣a,求a中的乙個非空子矩陣,使這個子矩陣中的元素和最大。  其中,a的子矩陣指在a中行和列均連續的一塊。

第一行乙個整數t,代表樣例總數。

輸入的第一行包含兩個整數n, m,分別表示矩陣a的行數和列數。

接下來n行,每行m個整數,表示矩陣a。

輸出一行,包含乙個整數,表示a中最大的子矩陣中的元素和。
1

3 3-1 -4 3

3 4 -1

-5 -2 8

10
取最後一列,和為10。
對於50%的資料,1<=n, m<=50;

對於100%的資料,1<=n, m<=500,a中每個元素的絕對值不超過5000。

對於這種題目一眼就看出來是最大子串行問題的變種,但是問題在於,這樣的題目怎麼做呢?兩方向都dp嗎?這樣好像不太現實(反正我沒成功),後來參考了網上的答案做出來了。

解法是採用通過遍歷所有子矩陣的初末位置,來控制列的範圍(控制初末列位置),累加每列的行之和,採用dp的方法找到該子陣(該子陣由於控制列的範圍,所以行的初末固定,列的大小與原陣列一樣)中行數均為起始到末尾的最大子子陣(即行數為起始到末尾的最大子陣),由於每種行數的情況下均會在遍歷時處理,因此當遍歷完全部的陣列時,最大值即為矩陣的最大子矩陣。

本題的可行性在於,所有的初始,末尾列的位置都能在兩個for迴圈遍歷到,那麼就可以得到每個確定初始,末尾列位置的小範圍(設為range a)內每行的個數確定的(每行的個數為從初始到末尾列的位置的個數)

最大矩陣a,由於任何一種初末列數確定的情況都能遍歷到,

所以會在某一時刻找到原來的小範圍(range a)內每行的個數小於該確定範圍的最大子矩陣b(該矩陣相當於初始,末尾列的位置為b矩陣的初始末尾列的位置每行的個數確定的最大矩陣a')

所以能找到在確定了初末列的位置的子矩陣中最大的子矩陣,當範圍為初始到末尾時,能找到這個陣列的最大子陣,也就是正確答案。

ac**:
#include #include int a[505][505], dp[505], row[505];

int main(void)}}

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

}

return 0;

}

DP 最大子陣和

最大子陣和 description 有乙個包含正數和負數的二維陣列。乙個子矩陣是指在該二維陣列裡,任意相鄰的下標是1 1或更大的子陣列。乙個子矩陣的和是指該子矩陣中所有元素的和。本題中,把具有最大和的子矩陣稱為最大子矩陣。例如 0 2 7 0 9 2 6 2 4 1 4 1 1 8 0 2這個陣列的...

藍橋杯 最大子陣 dp

歷屆試題 最大子陣 時間限制 1.0s 記憶體限制 256.0mb 問題描述 給定乙個n m的矩陣a,求a中的乙個非空子矩陣,使這個子矩陣中的元素和最大。其中,a的子矩陣指在a中行和列均連續的一塊。輸入格式 輸入的第一行包含兩個整數n,m,分別表示矩陣a的行數和列數。接下來n行,每行m個整數,表示矩...

DP題解 求最大子陣列和問題(問題拓展)

dp題解 求最大子陣列和問題 問題拓展 問題描述最大 連續子陣列和 對乙個有 n個元素的陣列,求最大的連續子陣列的和,並求其開始 結束下標。陣列的元素必然有正數也有負數才有意義 如果全是正數,那最大的子陣列就是本身 如果全部為負數,那最大子陣列就是空陣列 返回最大和為0 如果陣列的元素有正值有負值,...