矩陣 m 包含 r 行 c 列,第 i 行第 j 列的值為 mi,j。
請尋找乙個子矩陣,使得這個子矩陣的和最大,且滿足以下三個條件:
子矩陣的行數不能超過 x 行。
子矩陣的列數不能超過 y 列。
子矩陣中 0 的個數不能超過 z 個。
請輸出滿足以上條件的最大子矩陣和。
第一行輸入五個整數 r,c,x,y,z。接下來 n 行,每行輸入 m 個整數,第 i 行第 j 列的整數表示 mi,j。
1 ≤ r,c ≤ 500.
1 ≤ x ≤ r.91 ≤ y ≤ c.
1 ≤ z ≤ r x c.
-10
≤ mi,j
≤ 109
輸出滿足以上條件的最大子矩陣和。示例1
複製
5 5 3 3 40 0 10 0 0
3 4 0 2 3
-1 3 0 -8 3
0 0 32 -9 3
3 0 45 3 0
複製
82
示例2複製
2 2 2 2 2-1 -1
-1 -1
複製
0題意 : 在乙個大的矩陣中尋找乙個小的矩陣,但是行列是有要求的。
思路分析: 枚舉行的起點和終點,複雜度是 o(n^2) , 通過預處理字首和,可以得到此時的一行的數,再o(n)的用單調佇列搞一下即可
**示例 : (wa 了 , 還在除錯中 )
#include using namespace std;#define ll long long
const ll maxn = 1e6+5;
typedef pairpa;
ll n, m;
ll x, y, z;
ll mp[505][505], sum[505][505], cnt[505][505], ze[505][505];
ll f[505], f2[505];
pa que[2005];
int main()
}
for(ll i = 1; i <= n; i++)
} ll ans = 0;
for(ll i = 1; i <= n; i++)
que[r++] = make_pair(f[k], k);
while(l < r && k-que[l].second+1 > y)
while(l < r && f2[k]-f2[que[l].second-1] > z)
if (l< r) ans = max(ans, f[k]-f[que[l].second-1]);
//prllf("%lld %lld %lld %lld l = %lld r = %lld \n", i, j, k, ans, l, r);}}
}printf("%lld\n", ans);
return 0;
}
最大子矩陣的和
給出乙個n 2 n 100 並給出乙個n n的矩陣,矩陣中的數為 127,127 之間。求出矩陣中一塊子矩陣的最大和。比如 0 2 709 2 62 41 41 1 80 2和最大的子矩陣應該是這個 92 41 1 8它的和是15。第一行 整數n 接下來n行,每行n個整數,表示矩陣每個點所代表的值。...
求矩陣的最大子矩陣面積
問題引入 求解直方圖中最大的矩形面積 核心思想 讓二維陣列轉換成多層的一維陣列,再根據一維陣列構建直方圖 主函式,讓二維陣列轉換成多層的一維陣列,再根據一維陣列構建直方圖 public intmaxrecsize int map int maxarea 0 int height newint map...
求最大子矩陣的大小
給定乙個整型矩陣map,其中的值只有0和1兩種,求其中全是1的所有矩形區域中,最大矩形區域為1的數量。時間複雜度達到o mn 具體思路請參考原書 include include include using namespace std intmaxrecfrombottom int height,in...