~~~~
由於各種筆試、面試都有演算法程式設計題,總感覺對於演算法和資料結構比較心虛。。最近開始刷一些演算法題,複習一下資料結構以及演算法的相關知識。過程中記錄一下知識點,聊勝於無。
~~~~
兩個問題如下:
一共有10塊積木,每個積木上有乙個數字,0~9。
搭積木規則:
每個積木放到其它兩個積木的上面,並且一定比下面的兩個積木數字小。
最後搭成4層的金字塔形,必須用完所有的積木。
下面是兩種合格的搭法:
01 2
3 4 5
6 7 8 9
03 1
7 5 2
9 8 6 4
請你計算這樣的搭法一共有多少種?
考慮如下四則運算:
□ + □ = □
□ - □ = □
□ × □ = □
□ ÷ □ = □
每個方塊代表1~13中的某乙個數字,但不能重複。
比如: 6 + 7 = 13
9 - 8 = 1
3 * 4 = 12
10 / 2 = 5
以及:
7 + 6 = 13
9 - 8 = 1
3 * 4 = 12
10 / 2 = 5
就算兩種解法。(加法,乘法交換律後算不同的方案)
你一共找到了多少種方案?
~~~~
上面兩道題的解題思想都是一樣的,基本思路是進行全排列,然後找出所有滿足要求的解。可以用蠻力法窮舉的,但是顯然會面臨超時問題。
~~~~
最重要的就是選好全排列的資料結構以及有效地搜尋演算法,有如下解題思路:
全排列問題可以看做一棵樹,樹的第i層是第i個位置的所有取值可能,每個節點可能是0-9中的所有數,因此可以得到乙個10n~~~~10^n
10n(n個位置的全排列)個葉子大小的樹;
考慮題目條件,①不能重複;②滿足一定的條件;
使用dfs搜尋,終止條件為全排列的長度;同時定義全域性變數,記錄滿足條件的排列。
其實,上面的思想,只是使用dfs在全排列表示的樹中進行搜尋,搜尋空間仍然為10n
10^n
10n。
~~~~
考慮題目的要求,可以在搜尋過程中使用剪枝的思想。
~~~~
比如四則運算要滿足條件,那麼當搜搜第3、6、9、12個數時,可以判斷當前數與前面兩個數是否滿足運算條件,如果不滿足,則就放棄繼續向下搜尋。
public
class
seventhpa
public
static
void
dfs(
int idx)
if(idx ==13)
//return;
}for
(int i =
0; i <=
12; i++)}
}/**
* 剪枝判斷
*/public
static
boolean
check
(int i)
if(i >=6&&
(temps[3]
- temps[4]
!= temps[5]
))if(i >=9&&
(temps[6]
* temps[7]
!= temps[8]
))if(i >=
12&&
(temps[9]
/(float
) temps[10]
!= temps[11]
))return
true;}
/** * 搜尋結果判斷
*/public
static
boolean
judge()
if(temps[3]
- temps[4]
!= temps[5]
)if(temps[6]
* temps[7]
!= temps[8]
)if(temps[9]
/(float
) temps[10]
!= temps[11]
)return
true;}
}
void
dfs(
int idx)
void
main()
演算法筆記 深度優先搜尋 DFS
深度優先搜尋 depth first search,簡稱深搜 是一種極其常用的演算法,簡單來說,符合以下策略的就可以稱為深度優先搜尋。在圖中行走,沒有走過的點稱為 新點 所有走過的點稱為 舊點 開始時所有的點都是新點,從任意節點1出發,走向任意乙個新節點,同時將新節點標記為舊節點,然後重複此步驟。如...
《演算法筆記》深度優先搜尋DFS
問題 有n件物品,每件重量為w i 價值為c i 放進容量為v的揹包中。問 能放進揹包的物品的最大價值?分析 1.每件物品 選 不選,兩種狀態 迷宮的岔道口 2.超過v,邊界 迷宮的死胡同 3.到達邊界,返回最近的岔道口 4.dfs需要記錄 5.兩種轉移狀態 dfs index 1,sumw w i...
深度優先搜尋演算法(DFS)
1.深度優先搜尋屬於圖的遍歷演算法的一種,英文縮寫為dfs即depth first search.其過程簡要來說是對每乙個可能的分支路徑深入到不能再深入為止,而且每個節點只能訪問一次。2.搜尋策略 深度優先遍歷圖的方法是,從圖中某頂點v出發 1 訪問頂點v 2 依次從v的未被訪問的鄰接點出發,對圖進...