小红想知道,她最多进行三次操作,能获得的最大和是多少。
第一行两个整数,表示矩阵的大小。
接下来行,每行
个整数
,表示矩阵中的元素。
输出一个整数,表示小红最多进行三次操作,能获得的最大和。
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); } }