【记录算法题之路】数组最大和
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
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);
}
}
输入描述:
每个测试输入包含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实现
- php 数组 高效随机抽取指定条记录的算法
- 算法 | 最大连续子数组
- 背包算法练习--求小于某数字的数组最大和:
- 求解最大连续子数组的算法
- 【算法总结-DP】求子数组的最大和
- 求数组最大子段和的常用算法
- 算法学习---求数组中的最大数
- Python算法与数据结构--求所有子数组的和的最大值
- 算法学习记录十一(C++)--->调整数组顺序使奇数前偶数后
- 算法学习-连续子数组求和最大值
- JAVA代码—算法基础:最大连续子数组乘积问题
- [算法]数组排序之后相邻数的最大差值
- 最大连续子数组的和(记录子数组范围)
- 算法训练 寻找数组中最大值
- 蓝桥杯 ALGO-49 算法训练 寻找数组中最大值
- 浅析最大二分图匹配算法中记录数组book的真实作用
- 数组字符串那些经典算法:最大子序列和,最长递增子序列,最长公共子串,最长公共子序列,字符串编辑距离,最长不重复子串,最长回文子串 (转)
- 贪心算法解决求数组最大连续和
- (算法)最大子数组和以及最大子矩阵和