Use this to learn the idea, then write your own version.
1package main2 3import (4 "bufio"5 . "fmt"6 "io"7)8 910func CF41D(_r io.Reader, out io.Writer) {11 in := bufio.NewReader(_r)12 var n, m, K int13 Fscan(in, &n, &m, &K)14 K++15 a := make([][]byte, n)16 for i := range a {17 Fscan(in, &a[i])18 }19 dp := make([][][]int, n)20 for i := range dp {21 dp[i] = make([][]int, m)22 for j := range dp[i] {23 dp[i][j] = make([]int, K)24 for k := range dp[i][j] {25 dp[i][j][k] = -126 }27 }28 }29 type pair struct{ j, k int }30 to := make([][100][11]pair, n)31 var f func(i, j, k int) int32 f = func(i, j, k int) (res int) {33 v := int(a[i][j] & 15)34 kk := (k + v) % K35 if i == 0 {36 if kk > 0 {37 return -1e938 }39 return v40 }41 dv := &dp[i][j][k]42 if *dv != -1 {43 return *dv44 }45 defer func() { *dv = res }()46 res = -1e947 if j > 0 {48 if r := f(i-1, j-1, kk); r > res {49 res = r50 to[i][j][k] = pair{-1, kk}51 }52 }53 if j < m-1 {54 if r := f(i-1, j+1, kk); r > res {55 res = r56 to[i][j][k] = pair{1, kk}57 }58 }59 return res + v60 }61 ans, mxJ, mxTo := -1, 0, [][100][11]pair{}62 for j := 0; j < m; j++ {63 res := f(n-1, j, 0)64 if res > ans {65 ans, mxJ, mxTo = res, j, append([][100][11]pair(nil), to...)66 }67 }68 if ans < 0 {69 Fprint(out, -1)70 return71 }72 Fprintln(out, ans)73 Fprintln(out, mxJ+1)74 path := make([]byte, 0, n-1)75 for i, j, k := n-1, mxJ, 0; i > 0; i-- {76 t := mxTo[i][j][k]77 if t.j < 0 {78 path = append(path, 'L')79 j--80 } else {81 path = append(path, 'R')82 j++83 }84 k = t.k85 }86 Fprintf(out, "%s", path)87}88 8990