From 64cf5516356e3cb71067b5d34b986b01a95f2d39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B4=94=E6=B0=B8=E5=87=A1?= <3141722654@qq.com> Date: Wed, 26 Apr 2023 15:56:14 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B4=94=E6=B0=B8=E5=87=A1=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...0\345\271\263\346\226\271\346\225\260.png" | Bin 20419 -> 0 bytes alg.md | 114 ++++++++---------- alg.py | 23 ++-- gen.py | 22 +++- test.py | 25 +--- 5 files changed, 88 insertions(+), 96 deletions(-) delete mode 100644 "279\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.png" diff --git "a/279\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.png" "b/279\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.png" deleted file mode 100644 index 6b01e2bd2a3cfc1ce474efe5357685ded31d93bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20419 zcmchrq)5p z1hztNGtvy~7vHL?chL|P(h68b77roZ(OIIOkmAzz3S=70o?gzs&~AX8eSN=0(gmVT zTyyh~g!qs^7$dxW35l7C7WV1A?E;hRv$*#>>JLqN4}3iiFrD|-hVz^I<`_=9J znuaMLtw_q_b(s4O*3s!JNO|4yTlek5-c{uB@oZ=TMCc4VUJLJ($W5C)kBEHM;|Tq9 zEktNQ2Or~z>~t$&c92D~33YU6N#ZB%`IpgjAh^hY)p8`5a5q5bO0UNuQ$KPC^GHX& zPzZ^AdI0p0^_WMxi+b#YkUltG@le*IVmsT$mEt>piVZwgC`n_%*?!1wt5AombIZms zZpb{ME?MY=#$xI8ah(Q#GxE8|ejR&Lao6*c452<4@(37RhK_pd{uLqs{|f%;xChnI zk?c5c@$9MA2gtt4E+seoENT^b(p|MY&2ZFNM|E_JR1@GvRI}8j>D2m|Vt#*NGhw#5 zvu(>&UkbdGwSu#wI=s{Jx+ID-=EINzp@e>zH!u5{+Q~FBxEUcyUL>lX6)JS%uYFpM z%+cM40d|j($11y>Y;}*$4}=4U2*7!h*a{>x&Drm9D!k=*yffRkh&-N!*W zH@4S2Tq3tSj{}g~iI7%`;so0?)3m1pAs&*ulXn(j>mha2M;hj-=TEmEM7a@lx$d}| z_;kL20>bSKhk2RdHtIxOM@xOP?aEE#_*$*|J#jx|J=4(0yD2Zg4~XwUCL3wp^C#NShQ(plG6cRE?O`TY^1MddAI zUw3FL1`49S6sVuO6hz-{FkSq1-{XKc*5@AwTHk%$sq?=btrYdCp8rPsZ+9W7_nh)= z&i6(uTO8QLj6fZ4bh>@Z^g`1sK0dwq z(SJT}5ofNr$rsyyehK1s%@-l?11=uZ~Ki;VG@M0{~(*f9Xe1}p3EZe zVn(&sQ3Kp`qsaPXIo^DH(Y)s^5df>|bnXay-dR?sFs-v&eGpy~j%efK&q&pP4IIXZ zkgtc94{B=JSk&ZwxsGN+VglRLBZOh;dU`#CMmaUL_37LjeSFKK`r3meJP-UJItXjR zsA~jeOBMv#3M^7yU@O_p44G2Z?oxGS8K87P?wFfa6tSgD@WI`3?(DZiRF-s<&QebV z8wG|Vy_;QJA|qbCGNGF^QO0kVpt)ZDQV+S#O`EjYb-9We)~1yZOe==wecJ;h z%A_P0<-=)ux$}@tBH^8!yV*~KSr*}irJl24r5G<`lq0LN96GYr@Kp0^15Sq-?@bX_ z3Chbp=y|G!C?GUN?|l#TXUi#N5$X!9vIrBJj(w|3WmbxycT`X0Gp#dCUsxx28*98~e?Us$+;KLw^0`?Wh0&{gYnG>yp($5ZF77vvU7u}ax z@VBWOw5ed`r)d|ISvDM_1|RV6^TJKCAR(ryQqt`u8P40Kx9SSaW6UCtMK={oWLY1J z0xWLNx@eCG;6xW6r!lPy}QrLzW5z-S`7KyrV0-^4cfkvKYLt1os zccq-2n4|Hh{Mm)rJ3jT@55YG?MP?hFVEDm-E`iV z;j~m#yR)!dXZ4aLALpvLAG=eDC7K483Pe_pYM%18vxOYw7A>Lg`yX|HulWjGp4VAQt{P#4bsT1lsDIz9nuxLb+>)N0 z)JS9)qRDk^e}3!J>|G(9O^Jxs`mn7XCSC-WG#6L&C|!X-?dRqy)6K=>i&i*;6LrOD<(F_!I18aLE&ZTitzN-q^P%YtGcePjlgjAJS zX6?e__29CE322WGziS0D8e)oybx^?dLbH6$>^WZ#u?SvoG#uZ$!X%>Dk)zIH8!aIT zcDq2*mTlN2HsYTH7OLGg(=e+zw{f@e?|Sr0jiM@(fBzT85vlJM}Z!_&Mafgzi36nnQTR;!F!Ni&+INOLf-}id;W%v9K-#rP36KS zV*iS#_Ztk^ktPoO*^$teojz^?t z$}P?66FYRZa*Hf8W7+aik#u{VEE38X^I1o-`slSRy_Uhe4RpbC8ox&w7UQ2G!cjGa zzXjt<6Cac9{u4Y2A`v*OBI|+GPh|2TorApnN6pz=8qP^jDg3}FeU&Oma&#tpUL|apVMqHj!Ywrlly+2$ z-erBaW!lq1sKWg+Xl9U5A7WFo4Y8Yf>tYZeuP|T;fSh#Q53&D@1!hgRZm-<_e2X0| z$uy}Jy^tAGe~M|x$Kz9?aQ<7WGY5P|jtA}!NF+n_1kSX4U&ehr^Kd;hrDkTA3>m*k z*jYdb=sQoZi-tlP;+BRU5*|8Flm;`+k@rjXfW-=$$ovNk$ zu0o_xve`6kkeGDBYDwlR#Y8XXf=?>=*PLHJO&CIZUOpvVhNwAU^C~cLT8s8!5An&6 zuNYN#fBup@-L9_VgM`aqBwi8}k1+#_qnf4EBZVyk09r|*D{E%d=Nw@;0rTCCGH&#MMAS8BOG!N|GI z75ViDLST5iZ3D;S5+{l#&t()yTT48x({Hs9H4Mnk%|11#mXDd1*TGSb?5$zv*9s#e zZL#I^5ExWk`0g=jNN}`kzw2Xrtu)qIW|NzT6f2N4 z^;X55LJ1c9>?7K6)3@rT1=hd`xqB*_Tx=&xg)&b!qE%O#>2r7JjKB11)7RWQD$#e> z?^}PzJHrsGoQNlc4|4Tu(M!m7br9MC`X7YpvV;LXpS@tq(Qy#aFbgL;zT;Fnw7bsn zf?Mj3`hA~c$%DB4PB;XA6EW$?n)#eph_1K_Nm>!U?*0Y}au*QKR za^O|xPz-@;z*llouK$jlKHtcxyDB6 zm~!QjN~g)xvY8&fRjhflv2_QZF`6kK)wDt=F2JZxVS;5-g_*Iit8T+_3KQT zD?f+SXcfSrs*$YHUbS{QhS)EHkKg2HpVN~D=h+%Pik?jWp{Ee-?m0d0?VQsyWapRk z6p1%|E6pRd$h@m(b+oYBlqNiT?|9n&DRwy1T*%fA|7WO6>_*I7#MxY*)q^8}Ebprh zUNIj#fP8`@pKv&Oht_q1{49bMI>%hwC;8tv@q=zZAXz-qD@AOEwpLrSy;i$pFr)(A zLojKZu|LT?ZVTqjDd|zkz&{F^PPL@nYN`p{G2YqlS&YE`{2tMSn0Bd^sy_&sQ!b*)gr?5<&;j z;3*P(HQMyd;uS~xl0F7{6+>t404Vi@Zm2e?mVq)YC3O<~1sTU&Qe4HyGDO#*K@L+N$=;-3_(jBfZR1QE1bu+^<89R_iIw_+;AHbBD`@9)Ab+3 z)Kw!m-|%;W`NzH}P0jRD7>eGL#wVaz)$C+|hIV6+Z!wr+!^zGr0y&q|OT?RKgS+ku zN*lE%+Rm5iX63xGYAe-)AiFBp(p29|ap>L>-#mEV)21#7l7D&p&Dk^~8yjhzgdRW8rh2GWNfIPQY(Lf=j^7!}zwfylB~Gc~s!PVj9tun5XPBLc zkiY%wR3$pJEMz96O)hFZC0(Cs%f#S+OZu!QSZBvS7IwswZR;pSme{jH|cFdG+41T z<*4CDjMm4|H!~@E=z`UEiLRRr61$jXhvC?mcq z*P)Ov2LuM$a52R^(zNZ&c04x%`=B*jIoMYvSMa(moCFOLRh_k;K&WH11srRrxKmK28Qn!C6b6{I!)b zkEAT)qB>BYyy5VZWy*kAV5~bc4diitH>g~BF=I8Ly~AkU91w}!dIqo|KHKNeR?9*v zgtxA#d0s!i*bN`apX1wWk)ofsmDdif{g~iXrX zj3fS(DwVd}Fy(aE++jFj##{Fn&`BPt-UtDkM6kz5ZqEFQUG&A;Y`7XHZqDvNazzMR zqOy2RJ<(=-rR3|(=+OA14?)+3cnzv`R*$HT@?`<}(mfe*H<728oh%#2AI@?Mp9pc* zsC;HMyBftpI2$|ns$MjI6B*bshHf(%hA zY1$YM6O51FMBRliBMwoNEg2V7J8b0s?ZEo>S^->$aESwd^(5%y@P@&wPI7>IZ<>hnhu)p!i2G1^S`MHLx|x zu}WY+lM2B@^M0H$IIF8zwEUx{cn2FN6L877fStGavW2{VTEQ63Q@b0yU?-RXaH4P5 zBnj~mc%sT%!+9i5nc#ot1v3^qyi06@KTCTh%2d2E)(rNL+6{|l#CX#=y6tt)gBaH? z-NyjK7^MkdgphX?%7!#dwTrOB0~EJJ3=cbfl98W*SCp=)Dv{H#DT#|v7&0@(qf}PI zP2^KF^P7S$gs|)AXhcnkN}oso;^bFWOX@+kNu9+>f(KBRSVp@rG@|CZoSha**s|)e zoSob=t2b;qHeh~bYZ%>_3QD|wz5=7gd`7X?d-)Oyul3G9{AkrElotJ^G5sgb1~c=V zbM^!Ncg`lB+I{6LV`lW6df_Tv1^LFg;j4Fz*c!iBYc%}k4XacS-l$}223M#OazPHJL`Yk!3s`UF_juI zmrziAQ1_NM-YJfI=Vt$wA~Z>hBo4<H#z7a$iJe0$f<7%dLGhp+FN31KBeUQP{eAM5|L*^Td`AAdM6vs z3#Q3*@i3sp3P9}BXHocVGqov#Lo(I5CC&}gBgQq7;gzJBSF1|ip4yY4G@NJyOekOG z5eukmt~2c|^7J9LF*&yE=#KEM9oDpCrQlN1_56D%gN7bEWqc+lwBtU2m2u^5;T=sa zl|{=Y0XDf-MYxTab@vm6aS|&mVmSQ3~|ePG9mHkXY!T zQy8}4?wg4`j^c!K;yrx}&Ek5kh`1JmIyvr=33$L4IQnGarOt~=5(??Y66BS=aG_Tt z!&|m|Qg5}D4s$>HDmk0VPl?6I*&KKR3V525u)L{m}My&Y~uw56+j8LG{<8y+vU;E3eg>qrHc8#Z`9&Y0phg;lu)Twtp@ejN_k$WTgwN|;{O8-U*F zI+%|7?)-j7?DZqJv?$)gTMoh%jjqa!1roK_i}OmCP$$EV1|q;H%ur0mXsexaz=wn} z?)A~s;r33?{;MIUOO!HBQO(Gy0QhriDfXi28iCtl9Z5kb9mfyVNGK82_+|mCl*@#H z2LEFLXGj+7#~(g?xZa$0u42o&O9xP=qA>J_P%4=oh=3*5zL%Ix$mxg~W^bRGnoX4q zsi{-7Hh8*-UhgA@3k1|bl6nVmA*EG$`?Yui&yB2{so1`9t7(1ok{-T-Fy*tPKHMF> zN#8C^_IGDaaVp6I7*X#ME!!*0O^b^fYGj+-`HfucQ~~ z>3;RP56J@~aVBtKu&LEznjH*O-kyMMdSi3I*~)|m&n;o7@lthzlr&h9i~^{!BUSs| z8V>9R)_k>wQw;iv5V$F|mc9ZrLE)yI3wKjMHU)K-+ZGs4j<4BMj29W%j~uR*K0y{m zbm>JC+MJos%sAB)cU}u&fgnAF&3<^pN`ee_zsIYAy3#pbU&F>SV~1qaoP0y1Dj4XU zm!{>ZU=?}(1y2%80P-_{y<5=C0DFdsQ-TdRR^#o>H%z!qfOo{h>{F&RKwo9S0Be)Z zs3kIF-E$%4PAVCe+7uqGkb!D}NCV~|v8Uu&Q_Wi=t29B5^fu2c8N1rpDT-h(_6n2! zS=83a;mZHk1^6LwV=KZr({uBCu7ACImTb$PD=;4yCSDg07B?NlK@XuGYNcSP_u+3lML zKHJnPAblm+8(XxG=tj_bg86S|apjwHx~k&-NLf3J&o}%-+?pi9*ydK>f7#bpvYe;* zA{yFDlqTFRNem7ShEv2{j>HlwWJd^Od^d|l`hQ^-A8h>IEZ+UuEIt@EH_A`FB=WnA zHBQIs&Ldgg!S>9_R^iW?1*$%a|_-E$h(in|Z5e2GJNhzJKS&omr0R;PSU9zI(@M z4gxc5lP#+WQpFip_rt@HotPtf?C6KgRU@l;-(CcGU@g&^*9@X|oYo+&=x9?ENV>;p za`c=7=t6sw{&pXyzUoe(b$J)* znYTMeB}Ul6q*7sD^lze8@b&LR?f(1q!zhf9mG)eXYf(DvQOg0lmS-#DY+TUnrs(?> zun)(|+fJhHEBe1lTEtnK9037rQ|X1!twoK{tPTqKGK+|oln1iAYD1jay~4GleL2@I z*M7byYlfDp0ZpH9(RPh#P$?C#muiX;YZ|1Tdc`C}^$=H~N(cPBx(G^w$|Va1SU;lt z)GS6D%qAQ1E1eC)_MB&2+743{{}HsY&#{IiT!N~{LxUIniR^CCIT~)Vn4H`uevX$6 zlGB@=@pd<8xWs1pZYH)55JJk89nTujin!`*068_McBki{GBytKvQMbf4%^gHfWGYb z8%x=+s?}#Zu7@Io^SZ!;PBCa5Zz?#}%5VOADmxTpm6c*e{N(#_Cs?W@cl;j!zg=Ur zfb~o-*HN2de__j`M_p;eD-4%^=~U3fmAsMxz_g9?Er#l_3}7VOoW?gq8R+iO_w1*s zJgT^py=p~W3OqCRvcmW4jGUQ4lA?qGj<-(FT2d$<=x|WTX{pe4m1C(tJ8N}v&Kh|* zERZ`O>76auVW6I*Jn?EOjZ3i&pL>h5M5{>uWjtX{;kh6da>?2fT|JLtg$wYOzell( z2XJsc38qf47Dyu{WePnTK7QJzL!S)Y5P|oM=tvmtbp{(tzAj!QmJ5mc=pHY+=0oSS zugH?1ynu*gQpmHJ&8&U3&xFyo+7q3atC5_<5x5Q_aAM%pjm|9 zdJ)$93L#Hd`&kNQewLa1lMsH&x?;N$R#Muz#|v5NU4{6ZL%K_}Rj1i7VGF{qp(>$l zJXqELJ)MoZOn5QgW;V5U{p%kGE$=pYkSRJHIdH8pb(+^xts#$RhrI~`H7ChmSYmRq zMTEt{)qz87G&+sUS5%^V{lQ9EKw(r^Otkn-1q76yA_q(bHX(QNLvP*!-FR}k5&Fr2=`frCbl|Jcj)Vi9~?$u ze|-JX+?=&QLEFjsbpYSs#aOF9V%k$015*@HE4?peCE@WWGS6=3IHhYN&7|yX~+3 zZYz(0hQe-J(>h#gt5g?QuW@e#Th{2ZM=bx}@SRKFU#`UEshZoef)I!)qoF;PS`XxR z-yiJnmp}6=NxGO|39*+sGw89C@Mfr>Ri~E1Ms=Ki_M5LI{@!o)2mS0fpSZX1dQPVN z&T&5RTwHY`3FnL*7-}QSIPR@vSduvIEdkP8kkw#WQ1y{)hdrVpyCw2eEhJ&^@qt9wd_G2>to zZ>`eS>gFN7HE7Eb&{2`=J3b(qp$kuNT<4$CCygc{zKl2AX$W)6jsPyzd49hZ_}% zjtF5R05TDdsV1GG9fK&Yg;8q2G#qQU+uR3bK`%{bir&VQzq2mKMtx&7`Zh5~3#3L} zj$SfqS&YQXAV24>vU>TL{Fdqlaz6VrmS?!)5{usG5Ppqzb7T5??|v&s(HkrnCl~D! zwJgd$3a~aiLT-a;oQRcNcSSYH)@tlbuK^t%It`94axYX*V(~`28cH zNY)m*-ajeg8mzO#)<_j@$LJG*{v6WF+q4~v8PpKs(e<)jdQlM;1^6>lYHM&rmRTjK z39Q4dljQKD->1h2MGxcuMG?#9P-*K1?)RJnR;o?rv`y3}@lLVU_LF15=}InCG$VR~ zAY7`wYTW8Ndubavw52`Xm`SY)(sZ5uP|z^RA4LO*2m~G(gybqq#i)EUo>hk8gJ@^R zk0jf3-N(1h>DCGK6Dj|JwP)5+BejIRjYApL>god5XWvC?zwRs0dDV1OM^%>$zhz*A z>bpwDo*9q-vHrv*)0x&#;0LXFWmfD95gbG{w=TajAe&#@iAZM;;A2VC{k=SJI z#`NIbdsPwV{Qt~;CeQ)xw|VN7D}Bp$3)X*RyV0m()TtW$#3pR$gq+mh7Ffhnxn)Rq4r03^=(kQ+WPk>(d^`FtM*<|z$=hkJ{z=dG z%wZjs9no0Z$gDi_tqD}fJD14ml}lARm*R6azO0cN7TjuLs$N%`A+al}Or{x}2lvKj9jI@+9tq$RuGb); z7)9>F9$E2hnOio`R)M5Fd9FUm)O%xXb1NmkDj#^UYQQsF_g>Bj#D8UxsGOsM=W0!}l)`G)}bsM%Mz z;^zQZ!L(9^m)&8CR-4Nu&De7MEFs8Qd@~|%!VeGX?@#UoxZTcgF*-I**@Cyp+;N<5 zVQ}gXFc#JGcc_o@o#$^1TqA~-hIc+?NNnaQHN*l?`XC7*t%fmQAZdWx8SC=Sz>Khe z(WrWqo@zP&kBzDYnUUyUM!;QZkrs)uBQA2?|EnooI3M`6QdNPty}=M&iLUVu5P_Z? za83Pc%|r^bx59(59M$hwN5RBWo@K)OOC!>rH{}lW{n-%!mi@ z;-{ii?D(<)CU%t!b2^V@!wboJ{?M=@IU=waqlU%dzbb#$q;UQE=N24j$u!^DjyM~AOTjK)PnR|LPd9-h~a0p1FY_n}{%_nY-8Lj_AKV3J1!qreD<`U$oOkaOgyI5*hsrHI59^6dhn=3OevWWFj z(D}S*bt_wP#hAb;WYFqRnL5x^^QXS@>ts}&HmBDOqJcUO0`AMKpPST`U59)>(qO;E zFFKF)>3IWN>)xmbDhwh+ScLMv7#cw;6}Z&ZzE+p3Op(3}+}u(U7-vqO1B0s9SktdW zeWo-Sf8XvfFvP*#f$2{ zPJv^eOTOIJd)%bL1tpukwaE!Jdde5f@Ul-lbuO~3E@^v^exE<(H}(7(`GNZhOnSAt z6`OQeCc1g?_|l`|UH8wogz!niO0aaoR_eFZU7g8R@!EIx?n53Y;0Lm!7`-}BMtF$0 zF>XPHAZuT&?{Hm?ABTi(C?y{sE*AN`Z8bP-JLUE*b;Ubkn9=Eb1ATJ%uF4wK47i`z zQj@8;E_&YNUOG(Q{;<1b^R>v`Ss}ofH&;%T7lCW4be=-RWrMtjC#uJEx^FeQ^*i@B zJJGK9OxSePvnN+4qb^c9aoJPzW0zzRMt6z){#7ySp@eG(+aF}~y$?mMHKn#j@Hccn z^t9^7(!bNwU;OVd>f}%I1X?-JbnO@Q?8etNgNKeXJB$(R9$D{M{5b86QEGap_rb9n zhZm$D9;+7fD$-bXZ^6{f&!aOcOS#f=XomBc0NucDMRfa@d=Je1jqja4vDc>NBp1MT zS%VB$G=J05T^Od#IdW6)TY|^)`hSLdNnDxx_hk8*{y2N04Mn+G*WuLVw$7}#(0TJI zabNm0rK=_A*{)ZCzm(LfiT0gt;rscMgums5aeyd z@Na`X>#IGUk)bd@`DLvOR~B3~*llh0JzutL6>I;CeEIL2(T3h%o6%lF5kgB%cNK7l z*UTm|5dg2Fl8AYEP5;aYl``#R))?hA4@ajNN6hV>>8tA$A4a84yzFDt&%yzrMOTEn zxUWeXSS%^leOzJn*o&Vpqe6=t7xQ@9qzPfgDG4z$yOR_d-xyAp-$o}_T=?LE#yEpRR9PnovXXOj5*!33{d$Z+&s;O`fYJnf;%I@5*wu@qAvLl3n@{_NZ@#r8`WiUz;qYK4@#-$)nBSa{$9XTf zmWXu)h4MFhKPHa~8L`gc{tqKa>R&vkFz;wtIab&OP%@ybeAILinb0w0b(I#`pe85S z>_nx7aq22r5a2$D3Y*``v@W4!1Dc`0^^=ni1zY240!;U55m+Cg>Y>eI_NC)&N z3^AxTk}T)#udH0L2>GkHnGz5Ow*qi; zn~X5vT6TH;8vKKPIqx1apDsp3X#}`QZdH}DSw()xa(w($wQu(Wc4>a{Jtbg%tx{9L ztsIr*T65U(^E@{!mswYvwdbozs4<3MrF2xc>utfeZdWd6d=K9u;&fL97l&z9Q(@rI z4$c(i`iAB~{#VB5mT1xXJ`9rV2`Z0_zJMl;zF8Z@h>DV(xjtE2j)s-Sew$3H`ysvw zNbrR4g3?-9$!E(Sf5&@Tlzf`;=}i@fk)GZ^Hmm78kI5@7@hM>2{1lR%pXd`6+&!z@ zDgKvcH46~q4AIIF=foip)L5IYfn9#{-@&V`PKdVPR8pj)Fnre zT@Dilt(5ZrAlm;cgFM3oQbd(F3Qc+8{5pnnV4<_96Yz>?RhQ}fYD70Em(tZWVZhEv zekJX8AdIMEQr?Ake5`+H&3t4PMfIy&u1U6hKz>-b%wC%Wbr%k8uknAzm>ORc^Tmz? zrN79~jwwC)%vf<_HRAZerdIjaet6w$QFdX@wfqR>8xJ;nZgyR>XpTuFmH`+KTH(`J zj>lF5mm)^1QvVQWzocRU#-#;y>vGz#wrCmQUEn?#d1&VFh07IsAXDlJ0RP5ydGf69 zT-SXz?y$yyAVV*oc={ z&#AX=A%;%@z_#XW=@KpYaUj26xGf)ycgZl$OzrXpxXYj{qPf_FM*Yu5dHuuOyoJdy z0qeUjR4TbYSq3EAXhJ_6*c4 z`C9bKUq;&S+#4Y*Y8^NjS#%z4ap(?TnZ6=u)KF~hcpG@19;}oHevbUAmnndZmXE#0D4I^d3Bgxh+OJtAqPB^624pCs|1%Ha{ zeR*f1xLd{i3o-J48hHA5^89ZhuKb*fB6au8%^wthxQFvb?L-Yf+Zwp^_KhIc20vyM zBi5Q13v%M882e&|UH3V|8!mLXwnxHLo16D_bsGMEx3vGlEmyGNE!v%9%sek=_u4w2 zm$Rci1Co^*haM;O{umNw2kOV729bWu2shxnRa-vg+eqn3diU{&APvjI?tEDy}tJ-@BJvGH#* z?MB13Kf30#{F3~8GRuI~#`?)y{1tHX^#i~tc-jrYp&c|`gXEz)AoJq|9Bv<@gR9jQ zoQS6KqASCT@1qLZY9HZ`;ukEdYjOxTd`_7Vo}b4|zNvG!`;OdghLF0a%t{uy7*(Yf z%gl+Fr`@gmPy<%ZvIPzFD6c$024Qk2edHf9rEO1J@ySMbQ0!}Y%p!N=e4=<}kwbGr z`Kmq%Fpkuc;UPNOM~n%VNh|l3i|$(InYQM#E7=k863O!gOBG>nsS_!VDDo!9lPu$h zGSWyP&`IenU`(3WspmSgR$WOuq%M8Z(eER1U0uS!p_0&9OK}Q!Kbh#wv$cMn&Rh{YK=NvYkq^hhYCYw3+p$*A*r$l8Ww-7ZqJfPwtwrC zdGv?j!buQvvL;!jaZ)c1z!_wx4w*7OOypcQJK!Zte_W95s@&Z~Ut3BGP3g)| zy2ZjO>S7FiK}!F?Aj92&vPl+aJm2w?TOw35Hcpn8^6VH3KJ%_bpJsH|koqiTiqbEj-qsNkI=uh!b`wTr-|oe4KZ zi2|k)YxQ~lw(9hcRDwLeAn|cLcr&v$&VK*3r*RoYzc61h<)O@zU_+5`6_no+ zWh=usj4kt($t#zc>ijze<_7_v3nOxS((O~ShO$&1Fx4?(F<;^XgT!4%H_uz<)0VMP z#zJ}D<+j7h>M?rvx!zVqIsmxR78?yMq1s^z+UsHJ%S)1Dm*=nTs1?=F@3Fn#ES2m7kk!9E#&I?b4m6|$Ly@hFC1|g>)VdnGiv#k5Ov@WBV1JpJeyoSxcTduM4 zJ2XGCao*tWrbc~OHc|AJqd7JF%G6SWx-8QwYF-hGg1Uq%IR~GqWbeEmQi4jaYE(dr z-l`eLtB5mr$gTPw7QP-0{rfUEnABmC1<|yGlG~20nLpaxV1;IyQ3D;m7fnmmhQ7}{ ztaPK==7D6~{=jZ+$hgMmI^z`W7yO1f z4h!$9las|}$VA}5lbjCw@3)^-2f#r&q#y;!Ats$*U7*g5bQ4T-r)XL-eP{n_SMXDy z(hhH#f~v}AEAE#E9@c_v=gBsNtQq1QF$2z``nTD(&9O##(4}e~n*YAuoo9DERXXEk z_Fq)a&a~pW$(^`cCw!B=?t7v~9ELH>7Wuo#Hh?^1_zOiG#dz-?WqL5*Jy+Kw=)bM_ zQD4k>zTqF1{xG?TWkX?Q*Dyanz!aQ|((BPEd3>^wk&=>ff@v(=oVt@W=UjMRIP<0Z zo@^i8`I~xoMY1L0^>bgh2;vAi+u6nfBX(PAYTD$#h_-Lz)AO9{ZVR+0X4rmA=)g$$ zzP!h~c|wtYm{F$viy7s8&=t%}t=!%Di+Q>aJg%)@7_9zeK;50ezwn53x@~8Rz@Q;0Uyf*;qQu8d5+*{(8&SJ!4Ji2tW7J1QgClxN4p zQGNbc{Y|tl-E@IX>a;2V8#S?@VoKD#ukEc!Q0b+|i~9~dw^l{sLCV5!q4{&6`?6Wu z_oY5WuJifbt|{LC&r%@8> z6`0sm`e-ZBt{Q5RM=5VL3g0~FPLq<%M8?Zx|7>wb{-H)yBS zsx%B94T&G?usOSnR(U&himAGe76{^5kWv`^ZIsTE+EfGje4}+7l%T zLpCNk22_54BKeYk=XnM`V)~v8Z@os<+g=bHcrY&M&Hco~q092Rb3ALSi{ap!?GWeX zPGGg^9k*iU@wVeph}!Lf3R4*VImCZn0mMMLZo~2O(Em+`{GZxpi-xkOv8$)7%eG=Q zc-M@$l4GO=*UI^GCs*w+A}hmjlq7O)8DU1Ou#=K`-~*i+GhpU=bZYU^>!J!-3I$T? z?ivJ|SL`}|SmiEe4xpckXTp^E)NEZ=Rs69&Zd(6tu-TX!pJP~eK6GFaD-dmtVrReg75 zK<047Zg$e3_fp0#rmqis|B5)1R3T~CkRoVky9mcV$;r{|w+0%HE6${lWh=1pnf{be z;68}#pLBHWF7{>j-Ezj8`)8JVSE3A?QYvoC(-oN2cIgQ)c^FlSQgl8w zJf(zx^z$fWR_OGASlR{LhfqC`k5gK%g6 zVytsn-Ep*X^Ulzn)8C0|DqjG7=U+`>RVzMXq#X=9|90z391+Om_D<}vewZYYW;={- zcmwS?U(Scl9dIxcF-hZYJHp^HoH~?)OI_^LV7tt?Ca- z=-<{?(#k zKhI{JKj;_hiv3T!AoVIWq3Y+0>7nxY_sFdR= j) + cout << num[i][j] << ' '; + cout << endl; + } +``` - -## 思路分析 -该算法使用动态规划的思想,具体思路如下dp[i]的值为和为 i 的完全平方数的最少数量,我们从1开始一直算到n,每次dp[i]等于所有能再加一个完全平方数等于i的值中的最小值,dp中最后一个元素就是我们要寻找的和为 n 的完全平方数的最少数量。 +## 思路 -1. 定义状态:dp[i]表示数字i最少可以由几个完全平方数的和组成。 -2. 初始化状态:dp[0] = 0,其余dp[i]均为正无穷。 -3. 状态转移方程:对于数字i,遍历每个小于等于i的完全平方数j*j,将dp[i-j*j]+1与dp[i]取最小值。 -4. 返回结果:dp[n]为数字n最少可以由几个完全平方数的和组成。 +- 我们用 f[i][j] 表示从三角形顶部走到位置 (i,j) 的最小路径和。这里的位置 (i,j) 指的是三角形中第 i 行第 j 列(均从 0 开始编号)的位置。 -## 数据测试 + 由于每一步只能移动到下一行「相邻的节点」上,因此要想走到位置 (i,j),上一步就只能在位置 (i−1,j−1) 或者位置 (i−1,j)。我们在这两个位置中选择一个路径和较小的来进行转移,状态转移方程为:f[i][j]=min(f[i−1][j−1],f[i−1][j])+c[i][j] -为了测试算法的鲁棒性,我们需要生成一些随机的数据进行测试。生成数据的思路如下: + 其中 c[i][j] 表示位置 (i,j) 对应的元素值。 -1. 生成一个随机数n,表示数字n需要分解为完全平方数的和。 -2. 为了保证算法的正确性,n的范围应该从1到较大的数,例如1000。 -3. 返回一个包含n的元组,作为算法的输入数据。 + 注意第 i 行有 i+1 个元素,它们对应的 j 的范围为 j=i 时,上述状态转移方程中有一些项是没有意义的。例如当 j=0 时,f[i−1][j−1] 没有意义,因此状态转移方程为:f[i][0]=f[i−1][0]+c[i][0] -## 时间复杂度分析 + 即当我们在第 i 行的最左侧时,我们只能从第 i−1 行的最左侧移动过来。当 j=i 时,f[i−1][j] 没有意义,因此状态转移方程为:f[i][i]=f[i−1][i−1]+c[i][i] -O(n*sqrt(n))。外层循环遍历n个数字,内层循环遍历每个数字的平方根,因此总的时间复杂度为O(n*sqrt(n))。 + 即当我们在第 i 行的最右侧时,我们只能从第 i−1 行的最右侧移动过来。 -空间复杂度:O(n)。需要使用一个长度为n+1的数组来存储状态。 + 最终的答案即为 f[n−1][n−1] 中的最小值,其中 n 是三角形的行数。 -## 代码实现 ```python -from random import randint -def generate_data(): - n = randint(1, 1000) - return (n,) -from typing import List -class Solution: - def numSquares(self, n: int) -> int: - # 初始化dp数组 - dp = [float("inf")] * (n + 1) - dp[0] = 0 - # 遍历每个数 - for i in range(1, n + 1): - # 遍历每个完全平方数 - for j in range(1, int(i ** 0.5) + 1): - dp[i] = min(dp[i], dp[i - j*j] + 1) - return dp[n] -def generate_data(): - n = randint(1, 1000) - return (n,) - -``` +def minimumTotal(self, triangle: List[List[int]]) -> int: + n = len(triangle) + f = [[0] * n for _ in range(n)] + f[0][0] = triangle[0][0] -## 测试示例 + for i in range(1, n): + f[i][0] = f[i - 1][0] + triangle[i][0] + for j in range(1, i): + f[i][j] = min(f[i - 1][j - 1], f[i - 1][j]) + triangle[i][j] + f[i][i] = f[i - 1][i - 1] + triangle[i][i] + + return min(f[n - 1]) -​ 下面是一个测试代码的例子: -```python -def test(): - s = Solution() - for i in range(10): - n = i * 100 - res = s.numSquares(n) - print(f"For n = {n}, the minimum number of perfect squares is {res}") -if __name__ == "__main__": - test() ``` +**复杂度分析** +时间复杂度:O(n^2) +其中 n 是三角形的行数。 -![](C:\Users\XUZIY\Desktop\279完全平方数.png) - -## 心得体会 - -git用起来没有第一次那么坎坷,基本的操作都没有问题,也在不断地用一些新东西。这次实验,我在不断加深对动态规划问题的理解。 - -## 实验环境 +空间复杂度:O(n^2) +我们需要一个 n∗n 的二维数组存放所有的状态。 -win10 -python3.11 -jupyter notebook +## 测试结果 -git. \ No newline at end of file +![屏幕截图 2023-04-25 211755](C:\Users\崔\Pictures\Screenshots\屏幕截图 2023-04-25 211755.png) \ No newline at end of file diff --git a/alg.py b/alg.py index af2aed3..e3b6f8f 100644 --- a/alg.py +++ b/alg.py @@ -1,12 +1,13 @@ -from typing import List class Solution: - def numSquares(self, n: int) -> int: - # 初始化dp数组 - dp = [float("inf")] * (n + 1) - dp[0] = 0 - # 遍历每个数 - for i in range(1, n + 1): - # 遍历每个完全平方数 - for j in range(1, int(i ** 0.5) + 1): - dp[i] = min(dp[i], dp[i - j*j] + 1) - return dp[n] \ No newline at end of file + def minimumTotal(self, triangle: List[List[int]]) -> int: + n = len(triangle) + f = [[0] * n for _ in range(n)] + f[0][0] = triangle[0][0] + + for i in range(1, n): + f[i][0] = f[i - 1][0] + triangle[i][0] + for j in range(1, i): + f[i][j] = min(f[i - 1][j - 1], f[i - 1][j]) + triangle[i][j] + f[i][i] = f[i - 1][i - 1] + triangle[i][i] + + return min(f[n - 1]) \ No newline at end of file diff --git a/gen.py b/gen.py index 1c16f48..c4bca9f 100644 --- a/gen.py +++ b/gen.py @@ -1,4 +1,20 @@ -nums = [3,2,1,6,0,5] - - +int num[5][5] = { 0 }; + while (num[4][4] == 0) + { + srand((int)time(0)); + for (int i = 0; i < 5; i++) + for (int j = 0; j <5; j++) + { + int a = (rand() % 100) + 1; + num[i][j] = a; + } + } + cout << "生成随机数组:" << endl; + for (int i = 0; i < 5; i++) + { + for (int j = 0; j < 5; j++) + if (i >= j) + cout << num[i][j] << ' '; + cout << endl; + } \ No newline at end of file diff --git a/test.py b/test.py index 3af3054..70a76db 100644 --- a/test.py +++ b/test.py @@ -1,19 +1,6 @@ -import gen -import alg - -n = gen.nums -root = alg.constructMaximumBinaryTree(n) -# 前序遍历二叉树 -def preorderTraversal(root): - res = [] - def helper(root): - # 如果树为空,则返回None - if not root: - return None - res.append(root.val) - helper(root.left) - helper(root.right) - helper(root) - return res -# 输出遍历结果 -print(preorderTraversal(root)) +输入 +[[2],[3,4],[6,5,7],[4,1,8,3]] +输出 +11 +预期结果 +11 \ No newline at end of file -- Gitee