最大矩形pascal
答案:1 悬赏:0 手机版
解决时间 2021-05-01 16:12
- 提问者网友:最爱你的唇
- 2021-04-30 20:18
问题描述:
一个N*M的矩阵,每个格子里面有个整数( 绝对值不大与10 ) ,每个子矩阵( 至少包含一个元素 )的价值就是它所包含的格子内的数的和。 现在求两个不相交的子矩阵(不包含相同的格子),使得他们的价值的乘积最大。
例如: N=3 , M=4,矩阵如图所示:
最大子矩阵值乘积为288。(左边两列的和为16,右边两列的和为18,结果为16*18=288)。
输入格式:
第一行有两个数字n, m ( n, m < 100)。以后的n行,每行有m个整数。
输出格式:
输出文件只有一个数,即两不相交子矩阵价值乘积的最大值。
样例1:
MATRIX.IN |
MATRIX.OUT |
1 7
-9 -9 8 8 1 7 -4 |
128
|
样例2:
MATRIX.IN |
MATRIX.OUT |
3 4
2 3 4 5
1 3 2 4
4 3 2 1
|
288
|
最佳答案
- 五星知识达人网友:从此江山别
- 2021-04-30 20:24
begin
readln(n,k);
for i:=1 to n do
begin
for j:=1 to n do
begin
read(a[i,j]);
f[i,j]:=f[i,j-1]+f[i-1,j]-f[i-1,j-1]+a[i,j];
end;
end;
for i:=1 to n-k+1 do
for j:=1 to n-k+1 do
g[i,j]:=f[i+k-1,j+k-1]-f[i+k-1,j-1]-f[i-1,j+k-1]+f[i-1,j-1];
for i:=1 to n-k+1 do
begin
l[i+k-1]:=l[i+k-2];
for j:=1 to n-k+1 do
if g[i,j]>l[i+k-1] then l[i+k-1]:=g[i,j];
end;
for i:=n-k+1 downto 1 do
begin
r[i]:=r[i+1];
for j:=1 to n-k+1 do
if g[i,j]>r[i] then r[i]:=g[i,j];
end;
for i:=1 to n-k+1 do
begin
u[i+k-1]:=u[i+k-2];
for j:=1 to n-k+1 do
if g[j,i]>u[i+k-1] then u[i+k-1]:=g[j,i];
end;
for i:=n-k+1 downto 1 do
begin
d[i]:=d[i+1];
for j:=1 to n-k+1 do
if g[j,i]>d[i] then d[i]:=g[j,i];
end;
ans:=0;
for i:=1 to n-k do
if l[i]+r[i+1]>ans then ans:=l[i]+r[i+1];
for i:=1 to n-k do
if u[i]+d[i+1]>ans then ans:=u[i]+d[i+1];
writeln(ans);
end.
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯