這道題用暴力解法+動態規劃。分析如下:
對於某個1*m的矩陣,即一個數列,求其maximal sub-rectangle,可以通過求最大長連續字串和來求得(這個用到了動態規劃)。
那麼對於n*m的矩陣,將每列的各個數字求和,將得到一個1*m的矩陣,用上文所說的方法求得的最大和即為該n*m矩陣的所有行數為n的子矩陣中的最大子矩陣和。
那麼這道題,通過枚舉所有行數為1、2、3.....N 的矩陣(暴力),分別用上述方法壓縮矩陣求最大連續字串和,找出其中最大值,即為所求結果。
我的解題代碼如下:
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <cstdlib> #include <string> #include <algorithm> using namespace std; int table[100][100]; int sum[100]; int N; int max_continuous_sum() { int maxs=0,s=0; for(int i=0; i<N; i++) { if(s>=0) s+=sum[i]; else s=sum[i]; maxs = maxs>s ? maxs : s; } return maxs; } int main() { cin >> N; int maxsum=0; int tmp; for(int i=0; i<N; i++) { for(int j=0; j<N; j++) { cin >> table[i][j]; sum[j]=table[i][j]; } tmp = max_continuous_sum(); maxsum = maxsum>tmp ? maxsum : tmp; for(int j=i-1; j>=0; j--) { for(int k=0; k<N; k++) sum[k]+=table[j][k]; tmp = max_continuous_sum(); maxsum = maxsum>tmp ? maxsum : tmp; } } cout << maxsum << endl; return 0; }