您的位置:首页 > 编程语言 > Java开发

【记录算法题之路】数组最大和

2017-04-11 19:24 155 查看
在一个N*N的数组中寻找所有横,竖,左上到右下,右上到左下,四种方向的直线连续D个数字的和里面最大的值 

输入描述:

每个测试输入包含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

解题:1.先从键盘接收一个二维数组N*N

Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int D = sc.nextInt();
int [][] arr= new int

;
for (int i = 0; i < N; i++) {
for(int j = 0; j < N; j++) {
arr[i][j] = sc.nextInt();
}
}

2.四种相加方式 分情况讨论行 ( i为行标,j为列标)

1.横竖两种方式的思想是相似的,重要的是条件的判断:比如横,每行都需要加到,所以跳出循环的条件为i>=N    j跳出循环的条件为j+k>=N或j>=N

2.左上到右下  比横加多的条件是 (j+k >= N || i+k >= N)

3.右上到左下  这个和其他的有所不同,因为左下的纵坐标会变为j-k  所以不可以让j-k<0;  横坐标的话不可以让i+k>N-1

import java.util.Scanner;

/*在一个N*N的数组中寻找所有横,竖,左上到右下,右上到左下,四种方向的直线连续D个数字的和里面最大的值
输入描述:
每个测试输入包含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*/

public class zuidahe {

public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int D = sc.nextInt();
int [][] arr= new int

;
for (int i = 0; i < N; i++) {
for(int j = 0; j < N; j++) {
arr[i][j] = sc.nextInt();
}
}
/*for (int i = 0; i < N; i++) {
for(int j = 0; j < N; j++) {
System.out.print(arr[i][j]+" ");
}
System.out.println();
}*/

//第一种 横加
int m1 = 0;
for (int i = 0; i < N; i++) {
for( int j = 0; j < N; j++) {
int sum = 0;
for(int k = 0; k < D; k++) {
if (j+k >= N) break;
sum = sum + arr[i][j+k];
}
if (m1 < sum) {
m1 = sum;
}
}
}
//第二种 竖加
int m2 = 0;
for (int i = 0; i < N; i++) {
for( int j = 0; j < N; j++) {
int sum = 0;
for(int k = 0; k < D; k++) {
if (j+k >= N) break;
sum = sum + arr[j + k][i];
}
if (m2 < sum) {
m2 = sum;
}
}
}
//System.out.println(Math.max(m1, m2));

//左上到右下
int m3 = 0;
for (int i = 0; i < N; i++) {
for( int j = 0; j < N; j++) {
int sum = 0;
for(int k = 0; k < D; k++) {
if (j+k >= N || i+k >= N) break;
sum = sum + arr[j + k][i + k];
}
if (m3 < sum) {
m3 = sum;
}
}
}

//右上到左下
int m4 = 0;
for (int i = 0; i < N-D+1; i++) { //这个条件有点疑问
for( int j = N - 1; j >= 0; j--) {
int sum = 0;
for(int k = 0; k < D; k++) {
if ( i + k >= N || j - k < 0) break;
sum = sum + arr[i + k][j - k];
}
if (m4 < sum) {
m4 = sum;
}
}
}
int m12 = Math.max(m1, m2);
int m34 = Math.max(m3, m4);
int m = Math.max(m12, m34);
System.out.println(m);
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 算法