parent
97674a6368
commit
9ca75884fc
@ -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 |
||||
} |
@ -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 |
||||
} |
@ -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 |
||||
} |
@ -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] |
||||
} |
@ -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 |
||||
} |
@ -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() |
||||
} |
@ -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] |
||||
} |
@ -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(")") |
||||
} |
||||
} |
@ -0,0 +1 @@ |
||||
package cap5 |
Loading…
Reference in new issue