首先我們不難想到列舉上下左右邊界,然後兩層迴圈統計權值和,複雜度 $ o(n^6) $ 。這個我們用字首和可以省去後面的迴圈,將複雜度降成 $ o(n^4) $ 。然後我們考慮不列舉上下左右四個邊界,我們只列舉其中的上邊界和下邊界,於是題目轉化成乙個一維找權值最大區間。
於是我們考慮乙個問題:怎樣求乙個數列的最大子段和。這個用dp可以做,設 $ f[i] $ 表示以 $ i $ 為右端點的最大欄位和, $ f[i]=max(f[i-1]+a[i],a[i]) $ 這個我們可以 $ o(n) $ 計算。
於是我們求出這整個矩陣的向上的字首和 $ s[i][j]=a[i][j]+s[i-1][j] $ ,這個可以 $ o(1) $ 求出上述一維狀態下的權值。
總複雜度 $ o(n^3) $
#include#include#include#include#include#include#include#include#include#include#include#include#define ll long long
#define db double
#define rg register int
using namespace std;
int n,ans;
int s[105][105];
int a[105],f[105];
inline int qr()
int main()
printf("%d\n",ans);
return 0;
}
最大子段和 最大子矩陣和
給出n個整數序列 可能為負數 組成的序列a1,a2,an,求該序列形如 的子段和的最大值。當所有整數均為負數時,定義最大子段和為0。多測試用例。每個測試用例佔2行 第一行是序列的個數n 0 n 10000 第二行是n個整數。為每個測試用例輸出一行結果 最大子段和。6 2 11 4 13 5 2 31...
最大子矩陣和
前言 今天花了很長時間,看了無數人寫的帖子,但是幾乎沒有人把這個問題一下子說得很清楚,所以,我把這個問題按照自己的思路寫出來,希望能夠把這個問題講清楚。問題 求乙個m n的矩陣的最大子矩陣和。比如在如下這個矩陣中 0 2 7 0 9 2 6 2 4 1 4 1 1 8 0 2 擁有最大和的子矩陣為 ...
最大子矩陣和
前言 今天花了很長時間,看了無數人寫的帖子,但是幾乎沒有人把這個問題一下子說得很清楚,所以,我把這個問題按照自己的思路寫出來,希望能夠把這個問題講清楚。問題 求乙個m n的矩陣的最大子矩陣和。比如在如下這個矩陣中 0 2 7 0 9 2 6 2 4 1 4 1 1 8 0 2 擁有最大和的子矩陣為 ...