题解 | #最大和#

最大和

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;
    }
}
全部评论

相关推荐

祈求顺利毕业😁:简历很好了,多投吧牛油😂。主要是环境不好,大家也卷
点赞 评论 收藏
转发
1 收藏 评论
分享
牛客网
牛客企业服务