前言
很久沒上來看了,此處來記錄一下之前用js做的幾個算法題。里面涉及動態規划、窮舉、迷宮、路徑等等。
以下是題目
- 編程:斷開鏈條
給定一個包含N個整數的數組A,假設這個數組表示的是一條鏈條,其中
每個元素表示鏈條上的一環。 現在我們想把這條鏈條斷成3小部分。 我們需
要做的就是斷開不相連的兩個環, 更確切的說,我們需要斷開環P、 Q
( 0<P<Q<N-1, Q-P > 1),得到三個小鏈條[0,P-1],[P+1,Q-1],[Q+1,N-1]。
上述操作的成本是A[P]+A[Q]。
例如:數組A為
A[0] = 5
A[1] = 2
A[2] = 4
A[3] = 6
A[4] = 3
A[5] = 7
我們可以選擇如下方式斷開鏈條
- ( 1, 3):成本是 2+6 = 8
- ( 1, 4):成本是 2+3 = 5
- ( 2, 4):成本是 4+3 = 7
寫一個函數
int breakchain(int A[], int N);
對任一個給定的鏈條,返回斷開鏈條的最低成本,比如上面的例子中,
需要返回最低成本5
假設: - N是整數,范圍[5,100000]
A的元素是范圍在[1,1000000000]的整數2. 編程: M個最大的數
編程實現從N個無序數中選取M個最大的數( 0 < M < N )
- 編程: 最大方形
給定一個元素是布爾型大小為N*M的矩陣A。 大小為L的方形可以放置在A
中的( X,Y) 處, 如果滿足:
0 < L <= min(N,M)
0 <= X <= N-L
0 <= Y <= M-L
A[X+i][Y+j] = true, 0 <= i < L, 0 <= j < L
如果L能被放置在( X,Y)以及( X+1,Y)或者( X,Y+1), 我們說它可以被
從( X,Y) 移動到( X+1,Y)或者( X,Y+1)。
我們想找出滿足以下條件的最大的L:
L可以被放置在( 0,0)
它可以被經過一系列的移動, 從( 0,0)到達( N-L,M-L)
換句話說,我們想找到最大的方形,可以從左上移動到右下, 移動方式
是向下或者向右移動。 一個極端情況是如果矩陣A中的元素全部是true,那
么L = min(N,M)。
寫一個函數: int move_square(int **A, int N, int M);
返回值為L。比如:
A[0][0]=true A[0][1]=true A[0][2]=true A[0][3]=false
A[1][0]=true A[1][1]=true A[1][2]=true A[1][3]=false
A[2][0]=true A[2][1]=true A[2][2]=true A[2][3]=false
A[3][0]=true A[3][1]=true A[3][2]=true A[3][3]=true
A[4][0]=false A[4][1]=true A[4][2]=true A[4][3]=true
A[5][0]=true A[5][1]=false A[5][2]=true A[5][3]=true
返回 2
A[0][0]=true A[0][1]=true A[0][2]=false A[0][3]=false
A[1][0]=true A[1][1]=false A[1][2]=false A[1][3]=false
A[2][0]=false A[2][1]=true A[2][2]=false A[2][3]=true
返回 0
A[0][0]=true
返回 1
假設:
N和M是范圍為[1,200]的整數 - 編程:順時針環繞列印矩陣元素
給定一個整數元素組成的矩陣,寫一個函數,返回一個數組,數組中的元
素是按照順時針遍歷矩陣中的元素而組成。例如如下的3x4矩陣:
2, 3, 4, 8
5, 7, 9, 12
1, 0, 6, 10
得到的數組的元素按照順序是“2, 3, 4, 8, 12, 10, 6, 0, 1, 5, 7, 9”. - 問答題
假設你英姿颯爽的站在120層摩天大樓的天台,手握兩個iphone(就是這
么豪!),並且可輕易到達任一樓層的陽台。請用最少的嘗試次數, 確定能
夠讓iphone自由下落而不會摔壞的最高層數。比如20層摔不壞, 21層就摔
壞了。在嘗試中你可以摔壞這兩個iphone,只要能得到答案。請說明最壞
情況需要多少次嘗試以及你的思路。