From 9ca75884fcae8a1b693f6179b54fa30ed4bdf46e Mon Sep 17 00:00:00 2001 From: lensfrex Date: Tue, 14 May 2024 21:18:35 +0800 Subject: [PATCH] cap4 examples --- cap4/common.go | 10 ++++++++++ cap4/ex15.go | 15 +++++++++++++++ cap4/ex24.go | 22 ++++++++++++++++++++++ cap4/ex25.go | 41 +++++++++++++++++++++++++++++++++++++++++ cap4/ex26.go | 31 +++++++++++++++++++++++++++++++ cap4/ex27.go | 22 ++++++++++++++++++++++ cap4/ex28.go | 17 +++++++++++++++++ cap4/example_test.go | 44 ++++++++++++++++++++++++++++++++++++++++++++ cap5/ex1.go | 1 + 9 files changed, 203 insertions(+) create mode 100644 cap4/common.go create mode 100644 cap4/ex15.go create mode 100644 cap4/ex24.go create mode 100644 cap4/ex25.go create mode 100644 cap4/ex26.go create mode 100644 cap4/ex27.go create mode 100644 cap4/ex28.go create mode 100644 cap4/example_test.go create mode 100644 cap5/ex1.go diff --git a/cap4/common.go b/cap4/common.go new file mode 100644 index 0000000..b7d931a --- /dev/null +++ b/cap4/common.go @@ -0,0 +1,10 @@ +package cap4 + +func _makeMatrix(m, n int) [][]int { + matrix := make([][]int, m) + for i := 0; i < m; i++ { + matrix[i] = make([]int, n) + } + + return matrix +} diff --git a/cap4/ex15.go b/cap4/ex15.go new file mode 100644 index 0000000..63fea0e --- /dev/null +++ b/cap4/ex15.go @@ -0,0 +1,15 @@ +package cap4 + +// Ex15 最大子段和 +func Ex15(nums []int) int { + result := nums[0] + currMaxSum := nums[0] + n := len(nums) + for i := 1; i < n; i++ { + num := nums[i] + currMaxSum = max(currMaxSum+num, num) + result = max(result, currMaxSum) + } + + return result +} diff --git a/cap4/ex24.go b/cap4/ex24.go new file mode 100644 index 0000000..dc95880 --- /dev/null +++ b/cap4/ex24.go @@ -0,0 +1,22 @@ +package cap4 + +// Ex24 树塔问题 +func Ex24(nums [][]int) (int, []int) { + steps := make([]int, 0) + + dp := make([][]int, len(nums)) + for i, layer := range nums { + dp[i] = make([]int, len(layer)) + copy(dp[i], layer) + } + + for i := len(nums) - 2; i >= 0; i-- { + layer := nums[i] + for j := range layer { + // 取最大的两个来源(下层同位置和下层同位置+1) + dp[i][j] += max(dp[i+1][j], dp[i+1][j+1]) + } + } + + return dp[0][0], steps +} diff --git a/cap4/ex25.go b/cap4/ex25.go new file mode 100644 index 0000000..5091d17 --- /dev/null +++ b/cap4/ex25.go @@ -0,0 +1,41 @@ +package cap4 + +// Ex25 项目资源分配,项目数,资源数,收益表(第i个项目可得到的利润) +func Ex25(m, n int, income []float64) ([]int, float64) { + dp := make([]float64, n) + tmp := make([]float64, n) + + a := _makeMatrix(m, n) + + for i := 0; i < n; i++ { + a[0][i] = i + } + + copy(dp, income) + copy(tmp, income) + + // 前i个项目 + for i := 1; i < m; i++ { + // 资源数限制在j时 + for j := 0; j < n; j++ { + // 第i个项目可分配k个资源 + for k := 0; k < j; k++ { + if dp[j-k]+income[k] > tmp[j] { + tmp[j] = dp[j-k] + income[k] + a[i][j] = k + } + } + } + + copy(dp, tmp) + } + + rest := n + gain := make([]int, m+1) + for i := m - 1; i > 0; i-- { + gain[i] = a[i][rest] + rest -= gain[i] + } + + return gain, dp[n] +} diff --git a/cap4/ex26.go b/cap4/ex26.go new file mode 100644 index 0000000..7b09c62 --- /dev/null +++ b/cap4/ex26.go @@ -0,0 +1,31 @@ +package cap4 + +import ( + "math" +) + +// Ex26 矩阵连乘,p为矩阵链,p[0],p[1]代表第一个矩阵的行数和列数,p[1],p[2]代表第二个矩阵的行数和列数 +func Ex26(p []int) (int, [][]int) { + length := len(p) + + m, s := _makeMatrix(length, length), _makeMatrix(length, length) + + for i := 1; i < length; i++ { + m[i][i] = 0 + } + + n := length - 1 + for l := 2; l <= n; l++ { + for i := 1; i <= n-l+1; i++ { + j := i + l - 1 + m[i][j] = math.MaxInt32 + for k := i; k <= j-1; k++ { + q := m[i][k] + m[k+1][j] + p[i-1]*p[k]*p[j] + if q < m[i][j] { + m[i][j], s[i][j] = q, k + } + } + } + } + return m[1][length-1], s +} diff --git a/cap4/ex27.go b/cap4/ex27.go new file mode 100644 index 0000000..3bdc429 --- /dev/null +++ b/cap4/ex27.go @@ -0,0 +1,22 @@ +package cap4 + +import "strings" + +// Ex27 最长公共子序列 +func Ex27(str1, str2 []rune) (int, string) { + dp := _makeMatrix(len(str1)+1, len(str2)+1) + subStr := strings.Builder{} + for i := 1; i <= len(str1); i++ { + for j := 1; j <= len(str2); j++ { + a, b := str1[i], str2[j] + if a == b { + dp[i][j] = dp[i-1][j-1] + 1 + subStr.WriteRune(a) + } else { + dp[i][j] = max(dp[i-1][j], dp[i][j-1]) + } + } + } + + return dp[len(str1)][len(str2)], subStr.String() +} diff --git a/cap4/ex28.go b/cap4/ex28.go new file mode 100644 index 0000000..7d411c5 --- /dev/null +++ b/cap4/ex28.go @@ -0,0 +1,17 @@ +package cap4 + +// Ex28 最长不下降子序列 +func Ex28(nums []int) int { + dp := make([]int, len(nums)) + + for i := 0; i < len(nums); i++ { + dp[i] = 1 + for j := 0; j < len(nums); j++ { + if nums[i] > nums[j] { + dp[i] = max(dp[i], dp[j]+1) + } + } + } + + return dp[len(dp)-1] +} diff --git a/cap4/example_test.go b/cap4/example_test.go new file mode 100644 index 0000000..168026f --- /dev/null +++ b/cap4/example_test.go @@ -0,0 +1,44 @@ +package cap4 + +import ( + "fmt" + "testing" +) + +func TestEx14(t *testing.T) { + result := Ex15([]int{-1}) + println(result) +} + +func TestEx24(t *testing.T) { + nums := [][]int{ + {9}, + {12, 15}, + {10, 6, 8}, + {2, 18, 9, 5}, + {19, 7, 10, 4, 16}, + } + result, steps := Ex24(nums) + println(result) + for _, step := range steps { + fmt.Printf("%d ", step) + } + println() +} + +func TestEx28(t *testing.T) { + nums := []int{3, 18, 7, 14, 10, 12, 23, 41, 16, 24} + result := Ex28(nums) + fmt.Println(result) +} + +func PrintEx26Answer(s [][]int, i, j int) { + if i == j { + fmt.Printf("A%d", i) + } else { + fmt.Print("(") + PrintEx26Answer(s, i, s[i][j]) + PrintEx26Answer(s, s[i][j]+1, j) + fmt.Print(")") + } +} diff --git a/cap5/ex1.go b/cap5/ex1.go new file mode 100644 index 0000000..813a9f9 --- /dev/null +++ b/cap5/ex1.go @@ -0,0 +1 @@ +package cap5