var marked []bool var count int func DFS(v int, g [][]int) { fmt.Println("v", v, "marked", marked) marked[v] = true adjs := getAdjs(v, g) for _, adj := range adjs { if marked[adj] == false { DFS(adj, g) } } } func getAdjs(v int, g [][]int) []int { var adjs []int for i, elm := range g[v] { if elm != 0 { adjs = append(adjs, i) } } return adjs } func createGraph(comm [][]int, n int) [][]int { for i := 0; i < n; i++ { for j := 0; j < n; j++ { if comm[i][j] >= 3 { comm[i][j] = 1 } else { comm[i][j] = 0 } } } return comm } func solution(comm [][]int, n int) { g := createGraph(comm, n) fmt.Println(g) marked = make([]bool, n) count = 0 for i := 0; i < n; i++ { if marked[i] == false { DFS(i, g) count++ } } }
若是鏈接1,3,子問題的劃分和上述討論是相似的。所以總數也等於F(2) * F(4)算法
可是鏈接1,6的話,狀況就不一樣了。這裏1,6間的路把整個花園分紅了兩個部分,每一個部分只有兩個口,所以方法總數是F(2) * F(2)數據結構
//f[2m] = 2*f[2m-2]*f[2] + f[c1]*f[c2], c1+c2 = 2m-2 func solution(n int) int { m := make([]int, n+1) m[0] = 0 m[2] = 1 for i := 4; i <= n; i = i + 2 { tmp := 0 for j := 2; j <= i-2; j = j + 2 { tmp += m[i-2-j] * m[j] } m[i] = 2*m[i-2]*m[2] + tmp } return m[n] }
func Up(board [][]int) { for i := 0; i < 4; i++ { board[0][i] += board[1][i] board[2][i] += board[3][i] board[1][i] = board[2][i] board[2][i] = 0 board[3][i] = 0 } } func Down(board [][]int) { for i := 0; i < 4; i++ { // board[1][i] += board[0][i] board[3][i] += board[2][i] // board[2][i] = board[1][i] board[0][i] = 0 board[1][i] = 0 } } func Left(board [][]int) { for i := 0; i < 4; i++ { board[i][0] += board[i][1] board[i][2] += board[i][3] board[i][1] = board[i][2] board[i][2] = 0 board[i][3] = 0 } } func Right(board [][]int) { for i := 0; i < 4; i++ { board[i][3] += board[i][2] board[i][1] += board[i][0] board[i][2] = board[i][1] board[i][1] = 0 board[i][0] = 0 } } func solution(oper []int, board [][]int) [][]int { for i := 0; i < len(oper); i++ { switch oper[i] { case 1: Up(board) case 2: Down(board) case 3: Left(board) case 4: Right(board) } } return board }
func createGraph(sweets []int) [][]int { n := len(sweets) graph := make([][]int, n) for i := 0; i < n; i++ { graph[i] = make([]int, n) for j := 0; j < n; j++ { graph[i][j] = 0 } } for i := 0; i < n; i++ { for j := i + 1; j < n; j++ { if GCD(sweets[i], sweets[j]) > 1 { graph[i][j] = 1 graph[j][i] = 1 } } } return graph } var marked []bool var count, max int //gcd(x, y) = gcd(y, x%y) func GCD(x, y int) int { for y != 0 { r := y y = x % y x = r } return x } func DFS(v int, g [][]int) { count++ marked[v] = true adjs := getAdjs(v, g) for _, adj := range adjs { if marked[adj] == false { DFS(adj, g) } } } func getAdjs(v int, g [][]int) []int { var adjs []int for i, elm := range g[v] { if elm != 0 { adjs = append(adjs, i) } } return adjs } func solution(n int, sweets []int) { graph := createGraph(sweets) marked = make([]bool, len(sweets)) for i := 0; i < n; i++ { if marked[i] == false { count = 0 DFS(i, graph) if count > max { max = count } } } }