62 lines
1.1 KiB
Go
62 lines
1.1 KiB
Go
package algo
|
|
|
|
import (
|
|
"math/rand"
|
|
"testing"
|
|
)
|
|
|
|
func TestDPKnownCase(t *testing.T) {
|
|
arr := []int{30, 35, 15, 5, 10, 20, 25}
|
|
want := 15125
|
|
|
|
if got := DP(arr); got != want {
|
|
t.Fatalf("DP(%v) = %d, want %d", arr, got, want)
|
|
}
|
|
}
|
|
|
|
func TestGreedyRandomCompare(t *testing.T) {
|
|
r := rand.New(rand.NewSource(1))
|
|
|
|
for tc := 0; tc < 500; tc++ {
|
|
matrixCount := r.Intn(5) + 3
|
|
arr := make([]int, matrixCount+1)
|
|
for i := range arr {
|
|
arr[i] = r.Intn(9) + 2
|
|
}
|
|
|
|
greedy := Greedy(arr)
|
|
dp := DP(arr)
|
|
if greedy < dp {
|
|
t.Fatalf("greedy beat dp unexpectedly: arr=%v greedy=%d dp=%d", arr, greedy, dp)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestGreedyIsNotAlwaysOptimal(t *testing.T) {
|
|
r := rand.New(rand.NewSource(2))
|
|
found := false
|
|
|
|
for tc := 0; tc < 500; tc++ {
|
|
matrixCount := r.Intn(5) + 3
|
|
arr := make([]int, matrixCount+1)
|
|
for i := range arr {
|
|
arr[i] = r.Intn(9) + 2
|
|
}
|
|
|
|
greedy := Greedy(arr)
|
|
dp := DP(arr)
|
|
if dp < greedy {
|
|
t.Logf("found counterexample: arr=%v greedy=%d dp=%d", arr, greedy, dp)
|
|
found = true
|
|
}
|
|
|
|
if dp > greedy {
|
|
t.Fatalf("why greedy < dp???")
|
|
}
|
|
}
|
|
|
|
if !found {
|
|
t.Fatal("expected to find at least one case where dp < greedy")
|
|
}
|
|
}
|