最大加权矩形
題目描述
為了更好的備戰 NOIP2013,電腦組的幾個女孩子 LYQ,ZSC,ZHQ 認為,我們不光需要機房,我們還需要運動,于是就決定找校長申請一塊電腦組的課余運動場地,聽說她們都是電腦組的高手,校長沒有馬上答應他們,而是先給她們出了一道數學題,并且告訴她們:你們能獲得的運動場地的面積就是你們能找到的這個最大的數字。
校長先給他們一個 N×NN\times NN×N 矩陣。要求矩陣中最大加權矩形,即矩陣的每一個元素都有一權值,權值定義在整數集上。從中找一矩形,矩形大小無限制,是其中包含的所有元素的和最大 。矩陣的每個元素屬于 [?127,127][-127,127][?127,127] ,例如
0 –2 –7 0 9 2 –6 2 -4 1 –4 1 -1 8 0 –2在左下角:
9 2 -4 1 -1 8和為 151515。
幾個女孩子有點犯難了,于是就找到了電腦組精打細算的 HZH,TZY 小朋友幫忙計算,但是遺憾的是他們的答案都不一樣,涉及土地的事情我們可不能含糊,你能幫忙計算出校長所給的矩形中加權和最大的矩形嗎?
輸入格式
第一行:nnn,接下來是 nnn 行 nnn 列的矩陣。
輸出格式
最大矩形(子矩陣)的和。
樣例 #1
樣例輸入 #1
4 0 -2 -7 09 2 -6 2 -4 1 -4 1 -1 8 0 -2樣例輸出 #1
15提示
n≤120n\le 120n≤120
/** @Description: To iterate is human, to recurse divine.* @Autor: Recursion* @Date: 2022-07-14 15:42:46* @LastEditTime: 2022-07-14 15:58:00*/ #include <bits/stdc++.h> #define LL long long using namespace std; const int maxn = 1e6 + 10; const int mod = 1e9 + 7; const int INF = 1e9 + 10; const int N = 1e4; int n; int a[N][N]; int sum[N][N]; int main() {ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);cin >> n;for(int i = 1;i <= n;i ++)for(int j = 1;j <= n;j ++)cin >> a[i][j];for(int i = 1;i <= n;i ++)for(int j = 1;j <= n;j ++){sum[i][j] = sum[i - 1][j] + sum[i][j-1] + a[i][j] - sum[i-1][j-1];}int ans = 0;for(int x1=1;x1<=n;x1++){for(int y1=1;y1<=n;y1++){for(int x2=1;x2<=n;x2++){for(int y2=1;y2<=n;y2++){if(x2<x1 || y2<y1) continue;//如果左上角比右下角還要大,就不用求了,下一個ans = max(ans,sum[x2][y2]+sum[x1-1][y1-1]-sum[x2][y1-1]-sum[x1-1][y2]);}}}}cout << ans << endl;return 0; }總結
- 上一篇: 关于git和 github
- 下一篇: 华硕笔记本拆机清尘,修理