96.go 558 B

1234567891011121314151617181920212223242526
  1. package main
  2. // G(n) -> number of unique binary search tree of [1...n]
  3. // F(i, n) -> ... of [1...n] while i is root
  4. // G(n) = sum(F(i, n)), i ~ [1...n]
  5. // F(i, n) = G(i-1) * G(n-i)
  6. // So, G(n) = G(0) * G(n-1) + G(1) * G(n-2) + ... + G(n-1) * G(0)
  7. func numTrees(n int) int {
  8. if n == 0 {
  9. return 1
  10. }
  11. G := make([]int, n+1)
  12. G[0], G[1] = 1, 1
  13. for i := 2; i <= n; i++ {
  14. for j := 1; j <= i; j++ {
  15. G[i] += G[j-1] * G[i-j]
  16. }
  17. }
  18. return G[n]
  19. }
  20. // func main() {
  21. // fmt.Println(numTrees(0))
  22. // fmt.Println(numTrees(1))
  23. // fmt.Println(numTrees(7))
  24. // }