微信公衆號:Jerry的算法和NLPpython
小區花園裏有n個入口,如今要修一些路,要求每一個入口只能有一條路,且每條路之間互不相交,求輸入爲n的時候有幾條路正則表達式
這道題目主要考察的知識點爲動態規劃
動態規劃主要就是要找準它的轉移方程和base case以及目標算法
題目中提到,N是一個輸入爲2-1000的偶數
先找base case:
N=2 dp[2]=1 只有一條路 那麼只有一種狀況 這個好理解
N=4 dp[4]=2
N=6 dp[6]=5數組
當N=8的時候,怎麼分析?微信
如今把每一個門都標上了號碼牌,咱們假設咱們從1開始看。數據結構
1一開始能夠和 2或者 8 相連,那麼剩下了6個門,那麼剩下六個門連通的可能總數爲dp[6](前面已經計算了)app
1能夠和7相連嗎?不能夠,由於這樣8不管如何都會使得他們相交
因此咱們必須隔兩個門取。機器學習
1接下來和 2+2=4 或者 8-2=6 相連 當1和4相連的時候 剩下的六個門組合爲dp[2]*dp[4]ide
此時 1 再和 4+2=6 或者 6-2=4 相連 此時已經發生了重複計算的狀況,設置好跳出條件便可函數
先鎖定一個門(假設爲1),從兩端開始 先和距離爲1的門相連,而後距離爲3 距離爲5直至發生重複計算跳出循環
或者從一端開始直至繞了一圈回到1這個門的時候跳出循環
1a=int(input()) 2dp=[0 for i in range(a+1)] 3dp[0]=0 4dp[2]=1 5dp[4]=2 6dp[6]=5 7for i in range(8,a+2,2): 8 for j in range(i-2,0,-2): 9 if j<i-j-2: 10 break 11 else: 12 if j==i-2: 13 dp[i]+=dp[i-2]*2 14 elif j==i-2-j: 15 dp[i]+=dp[j]*dp[j] 16 else: 17 dp[i]+=dp[j]*dp[i-2-j]*2 18print(dp[a])
2048遊戲是一個44的矩陣,用戶能夠按上下左右4個方向鍵讓全部的方塊向同個方向運動,兩個相同數字方塊撞一塊兒以後合併成爲他們的和,每次操做以後隨機生成個2或者4合併規則:相鄰會撞的兩個數字合而且一個位置只會觸發一次合併,且優先合併移動方向頂部的位置
好比【2,2,2,2】合併後【0,0,4,4】
【0,2,2,2】合併後【0,0,2,4】
輸入第一行是用戶按下的方向鍵,1表明上,2表明下,3表明左,4表明右接下來是一個44的矩陣,空格分割,0表明該位置沒有數字
這個題目其實就是考察對邊界條件的斷定和對兩數之間的值是否相等的斷定
1com = int(input()) 2l=[] 3for _ in range(4): 4 l.append(list(map(int,input().split()))) 5 6if com == 1: 7 for i in range(3, 0, -1): 8 for j in range(4): 9 if l[i-1][j] == l[i][j]: 10 l[i][j] = 0 11 l[i-1][j] *= 2 12 13 for k in range(3, 0, -1): 14 if l[k-1][j] == 0 and l[k][j] != 0: 15 l[k-1][j] = l[k][j] 16 l[k][j] = 0 17 if l[k-1][j] == l[k][j]: 18 l[k-1][j] *= 2 19 l[k][j] = 0 20 21elif com == 2: 22 for i in range(0, 3, 1): 23 print(i) 24 for j in range(4): 25 if l[i + 1][j] == l[i][j]: 26 l[i][j] = 0 27 l[i + 1][j] *= 2 28 29 for k in range(0, 3, 1): 30 if l[k + 1][j] == 0 and l[k][j] != 0: 31 l[k + 1][j] = l[k][j] 32 l[k][j] = 0 33 if l[k + 1][j] == l[k][j]: 34 l[k + 1][j] *= 2 35 l[k][j] = 0 36elif com == 3: 37 for i in range(4): 38 print(i) 39 for j in range(3, 0, -1): 40 if l[i][j - 1] == l[i][j]: 41 l[i][j] = 0 42 l[i][j - 1] *= 2 43 44 for k in range(3, 0, -1): 45 if l[i][k - 1] == 0 and l[i][k] != 0: 46 l[i][k - 1] = l[i][k] 47 l[i][k] = 0 48 if l[i][k - 1] == l[i][k]: 49 l[i][k - 1] *= 2 50 l[i][k] = 0 51 52elif com == 4: 53 for i in range(4): 54 print(i) 55 for j in range(0, 3, 1): 56 if l[i][j + 1] == l[i][j]: 57 l[i][j] = 0 58 l[i][j + 1] *= 2 59 60 for k in range(0, 3, 1): 61 if l[i][k + 1] == 0 and l[i][k] != 0: 62 l[i][k + 1] = l[i][k] 63 l[i][k] = 0 64 if l[i][k + 1] == l[i][k]: 65 l[i][k + 1] *= 2 66 l[i][k] = 0 67 68for i in range(4): 69 print(" ".join(map(str, l[i])))
2020大廠筆試 | 網易提早批(1)
2020大廠筆試 | 網易提早批(2)
2020大廠真題 | 騰訊筆試
揹包九講(1)0/1揹包問題
揹包九講(2)徹底揹包問題
劍指offer刷題交流羣
掃碼添加微信,必定要備註研究方向+地點+學校+暱稱(如機器學習+上海+上交+湯姆),只有備註正確才能夠加羣噢。
▲長按加羣