首页 > 试题广场 >

矩阵元素相乘

[编程题]矩阵元素相乘
  • 热度指数:7770 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
A[n,m]是一个n行m列的矩阵,a[i,j]表示A的第i行j列的元素,定义x[i,j]为A的第i行和第j列除了a[i,j]之外所有元素(共n+m-2个)的乘积,即x[i,j]=a[i,1]*a[i,2]*...*a[i,j-1]*...*a[i,m]*a[1,j]*a[2,j]...*a[i-1,j]*a[i+1,j]...*a[n,j],现输入非负整形的矩阵A[n,m],求MAX(x[i,j]),即所有的x[i,j]中的最大值。

输入描述:
第一行两个整数n和m。之后n行输入矩阵,均为非负整数。


输出描述:
一行输出答案。
示例1

输入

3 5
5 1 8 5 2
1 3 10 3 3
7 8 5 5 16

输出

358400
def fun(A, n, m):
    a = [[0 for j in range(m)] for i in range(n)]
    for i in range(n): # row
        for j in range(m): # col
            sum = 1
            # discuss col
            for x in range(m): 
                if x == j:
                    continue
                sum *= A[i][x]
            # discuss row
            for y in range(n):
                if y == i:
                    continue
                sum *= A[y][j]
            a[i][j] = sum

    return max([max(x) for x in a])
while True:
    try:
        n,m = list(map(int,input().split()))
    except:
        break
    data = []
    for i in range(n):
        data.append(list(map(int,input().split())))
    print(fun(data,n,m))
编辑于 2022-03-03 20:52:22 回复(0)
while True:
    try:
        n,m=map(int,input().strip().split(' '))
        #print(n,m)
        arr=[]
        for i in range(n):
            arr.append(list(map(int,input().strip().split(' '))))
        #print(arr)
        list1=[]
        list2=[]
        for i in range(n):
            sum1=1
            for j in range(m):
                sum1=sum1*arr[i][j]
            list1.append(sum1)
        for j in range(m):
            sum2=1
            for i in range(n):
                sum2=sum2*arr[i][j]
            list2.append(sum2)
        max_num=-float('inf')
        for i in range(n):
            for j in range(m):
                if arr[i][j]!=0:
                    num=(list1[i]*list2[j]//(arr[i][j])**2)
                else:
                    num1=1
                    num2=1
                    for x in range(i):
                        num1=num1*arr[x][j]
                    for x in range(i+1,n):
                        num1=num1*arr[x][j]
                    for y in range(j):
                        num2=num2*arr[i][y]
                    for y in range(j+1,m):
                        num2=num2*arr[i][y]
                    num=num1*num2
                if max_num<num:
                    max_num=num
        print(max_num)    
    except:
        break
发表于 2019-07-23 10:06:12 回复(0)
from functools import reduce
while 1:
    try:
        n,m=list(map(int,input().split()))
        A=[list(map(int,input().split())) for i in range(n)]
        x=[[1 for j in range(m)] for i in range(n)]
        B=[list(x) for x in list(zip(*A))]#矩阵A的转置
        ans=0
        for i in range(n):
            for j in range(m):
                row=A[i][:j]+A[i][j+1:]#去掉A[i][j]后的行和列
                col=B[j][:i]+B[j][i+1:]
                tmp=1
                if row and col:#需要考虑row、col是否为空的状况
                    tmp=reduce(lambda x,y:x * y,row)*reduce(lambda x,y:x * y,col)#第i行与第j列的乘积
                elif row and not col:
                    tmp=reduce(lambda x,y:x * y,row)
                elif not row and col:
                    tmp=reduce(lambda x,y:x * y,col)
                ans=max(tmp,ans)
        print(int(ans))
    except:
        break

发表于 2018-08-28 15:57:03 回复(0)