每个测试输入包含1个测试用例,第一行包括两个整数 N 和 D : 3 <= N <= 100 1 <= D <= N 接下来有N行,每行N个数字d: 0 <= d <= 100
输出一个整数,表示找到的和的最大值
4 2 87 98 79 61 10 27 95 70 20 64 73 29 71 65 15 0
193
import java.util.Scanner;
public class Main{
public static void main(String args[]){
Scanner scan = new Scanner(System.in);
int N = 0;
int D = 0;
N = scan.nextInt();
D = scan.nextInt();
int[][] nums = new int[N][N];
for(int i = 0; i < N; i++){
for(int j = 0; j < N; j++){
nums[i][j] = scan.nextInt();
}
}
int max = 0;
//确定各方向的第一个值的索引
for(int k = 0; k < N; k++){
//确定各方向连续D个值的开始索引
for(int begin = 0; begin <= N-D; begin++){
//横
int hsum = 0;
//竖
int ssum = 0;
//左上到右下1
int lsum1 = 0;
//左上到右下2
int lsum2 = 0;
//右上到左下1
int rsum1 = 0;
//右上到左下2
int rsum2 = 0;
//开始求各方向连续D个数的和
for(int m = 0; m < D; m++){
hsum += nums[k][begin+m];
ssum += nums[begin+m][k];
if((k+D+begin) <= N){
lsum1 += nums[k+begin+m][begin+m];
//避免1和2重复求k=0时的和
if(k != 0){
lsum2 += nums[begin+m][k+begin+m];
rsum2 += nums[k+begin+m][N-1-begin-m];
}
}
if((N-k-begin-D) >= 0){
rsum1 += nums[m+begin][N-1-k-begin-m];
}
}
if(hsum > max)
max = hsum;
if(ssum > max)
max = ssum;
if(lsum1> max)
max = lsum1;
if(lsum2 > max)
max = lsum2;
if(rsum1 > max)
max = rsum1;
if(rsum2 > max)
max = rsum2;
}
}
System.out.println(max);
}
}
import java.awt.*; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Scanner; /** * Created by Yuan on 2017/3/1. */ public class Main { public static void main(String[] args) throws IOException { Scanner scanner=new Scanner(System.in); int N= scanner.nextInt(); int D=scanner.nextInt(); int[][] Datas=new int[N][N]; for (int i=0;i<N;i++){ for (int j=0;j<N;j++){ Datas[i][j]=scanner.nextInt(); } } int maxValue=0; //水平查找和垂直查找 for (int i=0;i<N;i++){ for (int j=0;j<N-D+1;j++){ int sumLevel=0; int sumHigh=0; for (int k=0;k<D;k++){ sumLevel=sumLevel+Datas[i][j+k]; sumHigh=sumHigh+Datas[j+k][i]; } int temp; if (sumHigh>sumLevel) temp=sumHigh;else temp=sumLevel; if (temp>maxValue){ maxValue=temp; } } } //斜直线查找,讲两次斜线查找看作N-D*N-D的矩阵,分别从左上和右上开始计算 for (int i=0;i<N-D+1;i++){ for (int j=0;j<N-D+1;j++){ int sumL=0; int sumR=0; for (int k=0;k<D;k++){ sumR=Datas[i+k][N-j-1-k]+sumR; sumL=Datas[i+k][j+k]+sumL; } int temp; if (sumR>sumL) temp=sumR;else temp=sumL; if (temp>maxValue) maxValue=temp; } } System.out.println(maxValue); } }