题解 | #最大和#
最大和
http://www.nowcoder.com/questionTerminal/d86619949c9b44a0b63acd93983bd372
分别判断横、竖、左斜右斜,思路很简单,利用双指针移动窗口,就是方位要找好,debug比较麻烦
import java.util.*;
public class Main{
public static void main(String args[]){
Scanner in=new Scanner(System.in);
int n=in.nextInt();
int d=in.nextInt();
int a[][]=new int[n][n];
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
a[i][j]=in.nextInt();
}
}
int max1=Math.max(heng(a,n,d),shu(a,n,d));
int max2=Math.max(zuoxie(a,n,d),youxie(a,n,d));
System.out.println(Math.max(max1,max2));
}
static int heng(int[][] a,int n,int d){
int max=0;
for(int j=0;j<n;j++){
int l=0,r=d-1;int sum=0;
for(int i=0;i<d;i++){
sum+=a[j][i];
}
max=Math.max(sum,max);
while(r+1<n){
max=Math.max(max,sum+a[j][++r]-a[j][l]);sum+=a[j][r]-a[j][l];l++;
}
}
return max;
}
static int shu(int[][] a,int n,int d){
int max=0;
for(int j=0;j<n;j++){
int l=0,r=d-1;int sum=0;
for(int i=0;i<d;i++){
sum+=a[i][j];
}
max=Math.max(sum,max);
while(r+1<n){
max=Math.max(max,sum+a[++r][j]-a[l][j]);sum+=a[r][j]-a[l][j];l++;
}
}
return max;
}
static int zuoxie(int[][] a,int n,int d){
int max=0;
for(int j=0;j<=n-d;j++){
int l1=j,l2=0,r1=j,r2=0;int sum=0;
for(;r2<d;r2++,r1++){
sum+=a[r1][r2];
}
r2--;r1--;
max=Math.max(sum,max);
while(r1+1<n){
max=Math.max(max,sum+a[++r1][++r2]-a[l1][l2]);sum+=a[r1][r2]-a[l1][l2];l1++;l2++;
}
}
for(int j=1;j<=n-d;j++){
int l1=0,l2=j,r1=0,r2=j;int sum=0;
for(;r1<d;r2++,r1++){
sum+=a[r1][r2];
}
r2--;r1--;
max=Math.max(sum,max);
while(r2+1<n){
max=Math.max(max,sum+a[++r1][++r2]-a[l1][l2]);sum+=a[r1][r2]-a[l1][l2];l1++;l2++;
}
}
return max;
}
static int youxie(int[][] a,int n,int d){
int max=0;
for(int j=d-1;j<n;j++){
int l1=j,l2=0,r1=j,r2=0;int sum=0;
for(;r2<d;r2++,r1--){
sum+=a[r1][r2];
}
r2--;r1++;
max=Math.max(sum,max);
while(r1-1>=0){
max=Math.max(max,sum+a[--r1][++r2]-a[l1][l2]);sum+=a[r1][r2]-a[l1][l2];l1--;l2++;
}
}
for(int j=1;j<=n-d;j++){
int l1=n-1,l2=j,r1=n-1,r2=j;int sum=0;
for(;r1>=n-d;r2++,r1--){
sum+=a[r1][r2];
}
r2--;r1++;
max=Math.max(sum,max);
while(r2+1<n){
max=Math.max(max,sum+a[--r1][++r2]-a[l1][l2]);sum+=a[r1][r2]-a[l1][l2];l1--;l2++;
}
}
return max;
}
}