解题思路
给定一个 的矩阵
,对于矩阵中的每个元素
,计算除了第
行第
列之外所有元素的乘积,并找出所有这些乘积中的最大值。
解题步骤:
- 读取矩阵大小
和
,以及矩阵元素
- 对每个位置
,计算除了第
行第
列外其他元素的乘积
- 维护并更新最大乘积值
- 输出最终结果
代码
#include <iostream>
#include <vector>
using namespace std;
long shuzi(vector<vector<int>>& v, int i, int j) {
long sum = 1;
// 计算同列其他元素的乘积
for(int x = 0; x < v.size(); x++) {
if(x != i) sum *= v[x][j];
}
// 计算同行其他元素的乘积
for(int y = 0; y < v[0].size(); y++) {
if(y != j) sum *= v[i][y];
}
return sum;
}
int main() {
int n, m;
while(cin >> n >> m) {
vector<vector<int>> v(n, vector<int>(m));
// 读入矩阵
for(int i = 0; i < n; i++) {
for(int j = 0; j < m; j++) {
cin >> v[i][j];
}
}
// 计算最大乘积
long max = 0;
for(int i = 0; i < n; i++) {
for(int j = 0; j < m; j++) {
max = std::max(max, shuzi(v, i, j));
}
}
cout << max << endl;
}
return 0;
}
import java.util.*;
public class Main {
public static long shuzi(int[][] v, int i, int j) {
long sum = 1;
// 计算同列其他元素的乘积
for(int x = 0; x < v.length; x++) {
if(x != i) sum *= v[x][j];
}
// 计算同行其他元素的乘积
for(int y = 0; y < v[0].length; y++) {
if(y != j) sum *= v[i][y];
}
return sum;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(sc.hasNext()) {
int n = sc.nextInt();
int m = sc.nextInt();
int[][] v = new int[n][m];
// 读入矩阵
for(int i = 0; i < n; i++) {
for(int j = 0; j < m; j++) {
v[i][j] = sc.nextInt();
}
}
// 计算最大乘积
long max = 0;
for(int i = 0; i < n; i++) {
for(int j = 0; j < m; j++) {
max = Math.max(max, shuzi(v, i, j));
}
}
System.out.println(max);
}
}
}
def shuzi(v, i, j):
sum = 1
# 计算同列其他元素的乘积
for x in range(len(v)):
if x != i:
sum *= v[x][j]
# 计算同行其他元素的乘积
for y in range(len(v[0])):
if y != j:
sum *= v[i][y]
return sum
while True:
try:
n, m = map(int, input().split())
v = []
# 读入矩阵
for _ in range(n):
row = list(map(int, input().split()))
v.append(row)
# 计算最大乘积
max_val = 0
for i in range(n):
for j in range(m):
max_val = max(max_val, shuzi(v, i, j))
print(max_val)
except:
break
算法及复杂度
- 算法:暴力枚举每个位置,计算对应的乘积
- 时间复杂度:
- 对每个位置
都需要计算行和列的乘积
- 空间复杂度:
- 存储输入矩阵