Skip to content

Commit 802aeca

Browse files
Merge pull request #14 from himanshub16/dp/basic-algos
Add dynamic programming algorithms
2 parents c282e70 + 6670a40 commit 802aeca

File tree

3 files changed

+186
-0
lines changed

3 files changed

+186
-0
lines changed
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
// longest palindromic subsequence
2+
// http://www.geeksforgeeks.org/dynamic-programming-set-12-longest-palindromic-subsequence/
3+
4+
package longestPalindromicSubsequence
5+
6+
// package main
7+
8+
import "fmt"
9+
10+
func max(a, b int) int {
11+
if a > b {
12+
return a
13+
}
14+
return b
15+
}
16+
17+
func lpsRec(word string, i, j int) int {
18+
if i == j {
19+
return 1
20+
}
21+
if i > j {
22+
return 0
23+
}
24+
if word[i] == word[j] {
25+
return 2 + lpsRec(word, i+1, j-1)
26+
}
27+
return max(lpsRec(word, i, j-1), lpsRec(word, i+1, j))
28+
}
29+
30+
func lpsDp(word string) int {
31+
N := len(word)
32+
dp := make([][]int, N)
33+
34+
for i := 0; i < N; i++ {
35+
dp[i] = make([]int, N)
36+
dp[i][i] = 1
37+
}
38+
39+
for l := 2; l <= N; l++ {
40+
// for length l
41+
for i := 0; i < N-l+1; i++ {
42+
j := i + l - 1
43+
if word[i] == word[j] {
44+
if l == 2 {
45+
dp[i][j] = 2
46+
} else {
47+
dp[i][j] = 2 + dp[i+1][j-1]
48+
}
49+
} else {
50+
dp[i][j] = max(dp[i+1][j], dp[i][j-1])
51+
}
52+
}
53+
}
54+
55+
return dp[1][N-1]
56+
}
57+
58+
/*
59+
func main() {
60+
// word := "aaabbbbababbabbabbabf"
61+
word := "aaaabbbba"
62+
fmt.Printf("%d\n", lpsRec(word, 0, len(word)-1))
63+
fmt.Printf("%d\n", lpsDp(word))
64+
}
65+
*/
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
// matrix chain multiplication problem
2+
// https://en.wikipedia.org/wiki/Matrix_chain_multiplication
3+
// www.geeksforgeeks.org/dynamic-programming-set-8-matrix-chain-multiplication/
4+
5+
// package main
6+
package matrixChainMultiplication
7+
8+
import "fmt"
9+
10+
func min(a, b int) int {
11+
if a > b {
12+
return b
13+
} else {
14+
return a
15+
}
16+
}
17+
18+
func matrixChainRec(D []int, i, j int) int {
19+
// d[i-1] x d[i] : dimension of matrix i
20+
if i == j {
21+
return 0
22+
}
23+
q := 1 << 32
24+
for k := i; k < j; k++ {
25+
prod := matrixChainRec(D, i, k) + matrixChainRec(D, k+1, j) + D[i-1]*D[k]*D[j]
26+
q = min(prod, q)
27+
}
28+
return q
29+
}
30+
31+
func matrixChainDp(D []int) int {
32+
// d[i-1] x d[i] : dimension of matrix i
33+
N := len(D)
34+
35+
dp := make([][]int, N) // dp[i][j] = matrixChainRec(D, i, j)
36+
for i := 0; i < N; i++ {
37+
dp[i] = make([]int, N)
38+
dp[i][i] = 0
39+
}
40+
41+
for l := 2; l < N; l++ {
42+
for i := 1; i < N-l+1; i++ {
43+
j := i + l - 1
44+
dp[i][j] = 1 << 31
45+
for k := i; k < j; k++ {
46+
prod := dp[i][k] + dp[k+1][j] + D[i-1]*D[k]*D[j]
47+
dp[i][j] = min(prod, dp[i][j])
48+
}
49+
}
50+
}
51+
52+
return dp[1][N-1]
53+
}
54+
55+
/*
56+
func main() {
57+
D := []int{2, 2, 2, 2, 2} // 4 matrices
58+
fmt.Print(matrixChainRec(D, 1, 4), "\n")
59+
fmt.Print(matrixChainDp(D), "\n")
60+
}
61+
*/

dynamic-programming/rod-cutting.go

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
// Solution to Rod cutting problem
2+
// https://en.wikipedia.org/wiki/Cutting_stock_problem
3+
// http://www.geeksforgeeks.org/dynamic-programming-set-13-cutting-a-rod/
4+
5+
package dpRodCutting
6+
7+
// package main
8+
9+
import "fmt"
10+
11+
func max(a, b int) int {
12+
if a > b {
13+
return a
14+
} else {
15+
return b
16+
}
17+
18+
}
19+
20+
// solve the problem recursively: initial approach
21+
func cutRodRec(price []int, length int) int {
22+
if length == 0 {
23+
return 0
24+
}
25+
26+
q := -1
27+
for i := 1; i <= length; i++ {
28+
q = max(q, price[i]+cutRodRec(price, length-i))
29+
}
30+
return q
31+
}
32+
33+
// solve the same problem using dynamic programming
34+
func cutRodDp(price []int, length int) int {
35+
r := make([]int, length+1) // a.k.a the memoization array
36+
r[0] = 0 // cost of 0 length rod is 0
37+
38+
for j := 1; j <= length; j++ { // for each length (subproblem)
39+
q := -1
40+
for i := 1; i <= j; i++ {
41+
q = max(q, price[i]+r[j-i]) // avoiding recursive call
42+
}
43+
r[j] = q
44+
}
45+
46+
return r[length]
47+
}
48+
49+
/*
50+
func main() {
51+
length := 10
52+
price := []int{0, 1, 5, 8, 9, 17, 17, 17, 20, 24, 30}
53+
// price := []int{0, 10, 5, 8, 9, 17, 17, 17, 20, 24, 30}
54+
55+
// fmt.Print(price[5]+price[length-5], "\n")
56+
57+
fmt.Print(cutRodRec(price, length), "\n")
58+
fmt.Print(cutRodDp(price, length), "\n")
59+
}
60+
*/

0 commit comments

Comments
 (0)