首页 > 试题广场 >

小红的矩阵操作

[编程题]小红的矩阵操作
  • 热度指数:7 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
小红有一个大小为 n \times m 的矩阵,矩阵中每个元素都是非负整数。小红每次操作可以选择矩阵的一行或者一列,然后获得这一行或者这一列中所有元素的和,随后,这一行或者这一列中的元素将会被清零。
小红想知道,她最多进行三次操作,能获得的最大和是多少。

输入描述:
第一行两个整数 n, m,表示矩阵的大小。
接下来 n 行,每行 m 个整数 a_{ij},表示矩阵中的元素。
1 \leq n, m \leq 500
0 \leq a_{ij} \leq 10^9


输出描述:
输出一个整数,表示小红最多进行三次操作,能获得的最大和。

示例1

输入

2 3
1 2 5
3 4 6

输出

21

说明

进行两次操作,选择第一行和第二行,得到的和为 1+2+5+3+4+6=21
示例2

输入

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);
    }
}

发表于 2025-06-29 20:36:16 回复(0)