首页 > 其他分享 >HJ70_矩阵乘法计算量估算_入门栈使用的典型题

HJ70_矩阵乘法计算量估算_入门栈使用的典型题

时间:2023-04-01 17:45:16浏览次数:32  
标签:arr 59 矩阵 sum1 HJ70 print append 乘法

反思:

这题咋一看不难,但是越做坑越多,按照一开始不完善的思路无法完全通过测试。

参看高赞答案,代码行数特少。但是没考虑一个括号中有三个矩阵的情况。

思路:

1、判断哪两个矩阵开始相乘的条件:遇到“)”时,该字符前两个矩阵开始相乘。把相乘后矩阵行列数组压入栈栈中。该题默认不存在(A(BCD))一个括号中有三个矩阵的情况。如果一个括号中有三个及以上矩阵可以参考原来的错误答案。

2、采用order(i)-65的方法获取压入栈的矩阵,这种方法使代码更简洁。

参考高赞答案后通过测试的代码:

 1 #a=[['5'], ['23', '61'], ['61', '59'], ['59', '34'],['34', '56'], ['56', '35'],['(A(((BC)D)E))']]
 2 b=[['47', '45'], ['45', '31'], ['31', '20'],['20', '35'], 
 3    ['35', '59'],['59', '42'],['42', '28']]#这种情况矩阵相乘要放进“(”判断循环中,边判断边处理
 4 #ord(“A")=65
 5 temp=[]
 6 for i in b:
 7     temp.append(list(map(int,i)))
 8 print(temp)
 9 f=['(A((B(C(DE)))(FG)))']
10 arr=[]
11 sum1=0
12 for i in f[0]:
13     if i.isalpha():
14         arr.append(temp[ord(i)-65])#获得压入栈中矩阵。
15     #print(arr)
16     elif i==")" and len(arr)>=2:
17         matrix1=arr.pop()
18         matrix2=arr.pop()
19         a,b,c=matrix2[0],matrix1[1],matrix2[1]
20         arr.append([a,b])#把两矩阵相乘得到的新矩阵的行列压入栈中。
21         sum1=a*b*c+sum1
22 print(sum1)
23     

只通过18个测试案例的代码

 1 a=[['5'], ['23', '61'], ['61', '59'], ['59', '34'],['34', '56'], ['56', '35'],['(A(((BC)D)E))']]
 2 n=[]*len(a)
 3 for line in a[:-1]:
 4     n.append(list(map(int,line)))
 5 a=n+a[-1]
 6 n.pop(0)
 7 t1,t2,t=[],[],[]  
 8 for k,i in enumerate(a[-1]):
 9     if i=="(":
10         t1.append(k)
11     elif i==")":
12         t2.append(k)
13     else:
14         t.append(k)
15 print(t1,t2,t)
16 d=dict(zip(t,n))
17 #print(d)
18 def nu(t1:int,t2:int,t)->int:
19     num=0
20     tt,now=[],[]
21     for j in t:
22         if j in range(t1,t2):
23             num+=1
24             now.append(j)
25         else:
26             tt.append(j)
27     return tt,now
28 def su(now,fresult):
29     l=[]
30     sum1=0
31     for i in now:
32         l.append(d[i])
33     if fresult:    
34         if list(fresult.keys())[0]<now[0]:
35             print(l)
36             l.insert(0,list(fresult.values())[0])
37             print(l)
38         else:
39             l.append(list(fresult.values())[0])
40     repeat=len(l)-1
41     for i in range(repeat):
42         c,b=l[-1][0],l[-1][1]
43         a=l[-2][0]
44         print(a,b,c,sum1)
45         sum1=sum1+a*b*c
46         l.pop()
47         l.pop()
48         l.append([a,b])
49         fresult={now[0]:[a,b]}
50         print(a,b,c,fresult)
51     return sum1,fresult
52 sum2=0
53 fresult={}
54 while t:
55     t,now=nu(t1.pop(),t2.pop(0),t)    
56     
57     sum1,fresult=su(now,fresult)
58     sum2=sum2+sum1
59     print(now,fresult,t) 
60 print(sum2)

 

标签:arr,59,矩阵,sum1,HJ70,print,append,乘法
From: https://www.cnblogs.com/tanyuanqing/p/17278989.html

相关文章

  • 链表完成多项式乘法
    多项式乘法是在多项式加法的基础上完成的。1、多项式加法1#include<iostream>2usingnamespacestd;3typedefstructlnode{4intcoef;5intexp;6lnode*next;7}lnode;8classpoly{9lnode*head;10public:11voidcreate(in......
  • HJ69_矩阵乘法_数组
    思路:三层循环实现矩阵相乘。importsysa=[]forlineinsys.stdin:  a.append(list(map(int,line.strip().split())))#print(a)matrix1=a[3:3+a[0][0]]matrix2=a[3+a[0][0]:]nw=[[0foriinrange(a[2][0])]foriinrange(a[0][0])]forminrange(a[0][0]): ......
  • 华为OD机试 和最大子矩阵
    本期题目:和最大子矩阵题目给定一个二维整数矩阵要在这个矩阵中选出一个子矩阵使得这个子矩阵内所有的数字和尽量大我们把这个子矩阵成为“和最大子矩阵”子矩阵的选取原则,是原矩阵中一段相互连续的矩形区域输入输入的第一行包含两个整数N,M (1<=N,M<=10) 表示一个......
  • 华为OD机试 和最大子矩阵
    本期题目:和最大子矩阵题目给定一个二维整数矩阵,要在这个矩阵中选出一个子矩阵,使得这个子矩阵内所有的数字和尽量大我们把这个子矩阵成为“和最大子矩阵”,子矩阵的选取原则,是原矩阵中一段相互连续的矩形区域。输入输入的第一行包含两个整数N,M (1<=N,M<=10) 表示一个N......
  • 坐标系旋转矩阵以及坐标系不变旋转点的旋转矩阵
    1.坐标系不动的情况下,绕原点旋转2.旋转坐标系的情况2.1推导情况......
  • min 与 + 运算转换成类似于矩阵乘法的推导过程
    记录下由$\min$与$+$运算转换成类似于矩阵乘法的推导过程,有错误请在评论区指出qwq。我们先简单证明一下矩阵乘法的结合律。设有矩阵$A_{n\timesm}$,$B_{m......
  • P1005 [NOIP2007 提高组] 矩阵取数游戏
    思维题:显然每个行可以互相独立来处理。贪心和暴力显然都不容易处理这题,所以我们只能考虑dp。每次只能取最左边和最右边的数,这显然很符合区间dp的特点。所以我们令dp[i]......
  • 借助 mperf 进行矩阵乘法极致优化
    作者:旷视MegEngine架构师洪超前言单精度矩阵乘法(SGEMM)是非常典型的计算密集型算子,对SGEMM的优化也经常被当作算子优化从业人员的练手项目。本文将借助于mperf,在A......
  • 借助 mperf 进行矩阵乘法极致优化
    作者:旷视MegEngine架构师洪超前言单精度矩阵乘法(SGEMM)是非常典型的计算密集型算子,对SGEMM的优化也经常被当作算子优化从业人员的练手项目。本文将借助于mperf,在......
  • 基于一阶RC模型,电池带遗忘因子递推最小二乘法+扩展卡尔曼滤波算法(FFRLS+ EKF),参数与SOC
    基于一阶RC模型,电池带遗忘因子递推最小二乘法+扩展卡尔曼滤波算法(FFRLS+EKF),参数与SOC的在线联合估计,matlab程序YID:76100659957301925......