解題思路: 首先,考慮一維的情況。a1,a2,a3,....an的最大子串行和。我們維護乙個(最大字首和),當這個字首和小於0的時候,就替換為當前值,那麼最大值一定在這些字首和中。
然後對於二維的情況,我們列舉可能的起始列標,這樣就是一維的最大子串行和的問題了。例如,當我們選定第一列和第三列後,把每一行第一列到第三列的數加在一起,那麼就是乙個一維的問題了。對於給定區間的和,我們可以通過字首和o(1)計算,sum[i,j]=sum[0,j]-sum[0,i-1]。
1 #include 2using
namespace
std;
34 typedef long
long
ll;5
const
int maxn=100005;6
const ll mon7 = 1e9+7;7
int a[105][105];8
int sum[105][105];9
intn,m;
1011
void
solve()
1225}26
}27 printf("
%d\n
",ans);28}
2930
intmain()
3148}49
solve();50}
51return0;
52 }
DP 最大子陣和
最大子陣和 description 有乙個包含正數和負數的二維陣列。乙個子矩陣是指在該二維陣列裡,任意相鄰的下標是1 1或更大的子陣列。乙個子矩陣的和是指該子矩陣中所有元素的和。本題中,把具有最大和的子矩陣稱為最大子矩陣。例如 0 2 7 0 9 2 6 2 4 1 4 1 1 8 0 2這個陣列的...
最大子段(陣)和
這是一道dp經典題 感覺什麼都經典 也是很常見的乙個題型,具體思路就是用sum記錄乙個字首和,從a 1 遍歷到a n 每次,加上去,但是一旦sum成了負數,就沒必要字首和了,重新賦值0 因為前面就是累贅了 然後,就做出來了.1 include2 using namespace std 3int n,...
最大子陣 C
problem description 給定乙個 n m 的矩陣a,求 a 中的乙個非空子矩陣,使這個子矩陣中的元素和最大。其中,a 的子矩陣指在 a 中行和列均連續的一部分。輸入的第一行包含兩個整數 n,m 1 n,m 50 分別表示矩陣 a 的行數和列數。接下來 n 行,每行 m 個整數,表示矩...