jzoj P1665 【coci2011/2012 1】MATRIX

来源:互联网 发布:ubuntu恢复出厂设置 编辑:程序博客网 时间:2024/06/05 06:23

题目大意:
在一个N*N的矩阵中找一个子矩阵使得主对角线A-副对角线B的和最大。

2<=N<=400 每个数范围在-1000到1000

题解:
就是对对角线主的那条搞搞前缀和,副的那条也搞搞,查询的时候就直接求线段长。
因为子矩阵是正方形而且数据比较小,所以从一个点开始+1+1地枚举,然后推出位置求用前缀和求长度。

var    sum:array [1..2,0..401,0..401] of longint;    i,j,k,l,n,m,ans:longint;begin    readln(n);    for i:=1 to n do    begin        for j:=1 to n do        begin             read(sum[1,i,j]);             sum[2,i,j]:=sum[1,i,j];             sum[1,i,j]:=sum[1,i,j]+sum[1,i-1,j-1];             sum[2,i,j]:=sum[2,i,j]+sum[2,i-1,j+1];        end;        readln;    end;    for i:=2 to n do    begin        for j:=2 to n do        begin              k:=2;              while (i-k>=0) and (j-k>=0) do              begin                    l:=(sum[1,i,j]-sum[1,i-k,j-k])-(sum[2,i,j-k+1]-sum[2,i-k,j+1]);                    if l>ans then ans:=l;                    inc(k);              end;        end;    end;    writeln(ans);end.
原创粉丝点击