給定乙個n*m的矩陣a,求a中的乙個非空子矩陣,使這個子矩陣中的元素和最大。 其中,a的子矩陣指在a中行和列均連續的一塊。
第一行乙個整數t,代表樣例總數。輸入的第一行包含兩個整數n, m,分別表示矩陣a的行數和列數。
接下來n行,每行m個整數,表示矩陣a。
輸出一行,包含乙個整數,表示a中最大的子矩陣中的元素和。
13 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 如果陣列的元素有正值有負值,...