小红想知道,她最多进行三次操作,能获得的最大和是多少。
第一行两个整数,表示矩阵的大小。
接下来行,每行
个整数
,表示矩阵中的元素。
输出一个整数,表示小红最多进行三次操作,能获得的最大和。
2 3 1 2 5 3 4 6
21
进行两次操作,选择第一行和第二行,得到的和为。
4 4 5 6 7 2 8 9 10 2 1 20 0 0 0 2 1 0
71
选择第一行、第二行、第二列,得到的和为71。
import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt(), m = in.nextInt();
int [][] arr = new int [n][m];
long [] row = new long [n];
long [] lie = new long [m];
for (int i = 0 ; i < n ; i++) {
long sum = 0;
for (int j = 0 ; j < m ; j++) {
arr[i][j] = in.nextInt();
sum += arr[i][j];
}
row[i] = sum;
//System.out.print(row[i] + " ");
}
//System.out.println();
for (int i = 0 ; i < m ; i++) {
long sum = 0;
for (int j = 0 ; j < n ; j++) {
sum += arr[j][i];
}
lie[i] = sum;
//System.out.print(lie[i] + " ");
}
long ans = 0;
for (int k = 0 ; k < 3 ; k++) {
long max = 0;
int irow = - 1, ilie = -1;
for (int i = 0 ; i < n ; i++) {
if (row[i] > max) {
irow = i;
max = row[i];
}
}
for (int i = 0 ; i < m ; i++) {
if (lie[i] > max) {
ilie = i;
max = lie[i];
}
}
ans += 1L * max;
if ( irow != -1 && max == row[irow] ) {
for (int i = 0 ; i < m ; i++) {
lie[i] -= arr[irow][i];
}
row[irow] = 0;
} else if (ilie != -1 && max == lie[ilie] ) {
for (int i = 0 ; i < n ; i++) {
row[i] -= arr[i][ilie];
}
lie[ilie] = 0;
}
}
System.out.println(ans);
}
}