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...