《演算法分析與設計》Week 8

2021-07-30 20:16:49 字數 1382 閱讀 8686

96. unique binary search trees

description:

given n, how many structurally unique bst's (binary search trees) that store values 1...n?

for example,

given n = 3, there are a total of 5 unique bst's.

1         3     3      2      1

\ / / / \ \

3 2 1 1 3 2

/ / \ \

2 1 2 3

solution:

一、題意理解

給定乙個數n,有多少個異構的二叉搜尋樹用來儲存1...n?所謂異構,類似化學中的同素異構體,就是組成元素相同,但是在空間結構上的組成方式不同。

二、分析

1、可以用動態規劃來解,找到狀態轉移方程。要尋找節點數為n的二叉搜尋樹的異構體數量,可以依次尋找限制以i(i=1,2,...,n)為根節點的二叉搜尋樹的異構體,然後將其累加即可。不妨設:

g(n):儲存序列1...n的二叉搜尋樹的異構體數目,也是我們要求解的目標。

f(i, n):儲存序列1...n時,限制以i為根節點的二叉搜尋樹的異構體數目。

2、而動態規劃,無非就是用已經求解的值來得到另乙個條件下的值。有了以上的假設,很容易得到如下的式子:

g(n) = f(1, n) + f(2, n) + f(3, n) + ... + f(n, n)

f(i, n) = g(i - 1) * g(n - i)

第乙個式子很好理解,就是乙個累加。對於第二個式子來說,比如n = 6,當限制以3為根節點時,組成根節點3的左子樹,組成根節點3的右子樹,而左子樹的異構體數目自然等於g(3-1) = g(2),右子樹的異構體數目和的異構體數目相同,為g(6-3) = g(3)。所以f(3, 6) = g(2) * g(3)。

3、結合上述兩個式子,就可以得到最終的狀態轉移方程:

g(n) = g(0) * g(n-1) + g(1) * g(n-2) + g(2) * g(n-3) + ... + g(n-1) * g(0)

4、**如下:

class solution 

}int tmp = g[n];

delete g;

return tmp;

}};

Week8作業 A 區間選點II

問題描述 給定乙個數軸上的n個區間,要求在數軸上選取最少的點使得第i個區間 ai,bi 裡至少有ci個點。1 n 50000,0 ai bi 50000,1 ci bi ai 1。差分約束系統求解 結論 1.如果要求取最小值,則求最長路,將不等式全部化成xi xj k的形式,這樣建立j i的邊,權值...

Week8作業 C 班長競選

問題描述 大學班級選班長,n個同學均可以發表意見。若意見為a b,則表示a認為b合適。意見具有傳遞性,即a認為b合適,b認為c合適,則a也認為c合適。共m條意見,要求出最高票數和候選人名單。準備知識 kosaraju演算法 1.第一遍 dfs 確定原圖的逆後序序列。2.第二遍 dfs 在反圖中按照逆...

Week 8 作業A 區間選點II

給定乙個數軸上的 n 個區間,要求在數軸上選取最少的點使得第 i 個區間 ai,bi 裡至少有 ci 個點。輸入第一行乙個整數 n 表示區間的個數,接下來的 n 行,每一行兩個用空格隔開的整數 a,b 表示區間的左右端點。1 n 50000,0 ai bi 50000 並且 1 ci bi ai 1...