Use this to learn the idea, then write your own version.
1package main2 3import (4 . "fmt"5 "io"6)7 89func cf802N(in io.Reader, out io.Writer) {10 const inf int = 1e1811 var n, k, v int12 Fscan(in, &n, &k)13 14 st, st2, end := n, n+1, n+215 type nb struct{ to, rid, cap, cost int }16 g := make([][]nb, end+1)17 addEdge := func(from, to, cap, cost int) {18 g[from] = append(g[from], nb{to, len(g[to]), cap, cost})19 g[to] = append(g[to], nb{from, len(g[from]) - 1, 0, -cost})20 }21 22 addEdge(st, st2, k, 0)23 for i := range n {24 Fscan(in, &v)25 addEdge(st2, i, 1, v)26 if i > 0 {27 addEdge(i-1, i, inf, 0) 28 }29 }30 for i := range n {31 Fscan(in, &v)32 addEdge(i, end, 1, v)33 }34 35 dis := make([]int, len(g))36 type vi struct{ v, i int }37 fa := make([]vi, len(g))38 inQ := make([]bool, len(g))39 spfa := func() bool {40 for i := range dis {41 dis[i] = inf42 }43 dis[st] = 044 inQ[st] = true45 q := []int{st}46 for len(q) > 0 {47 v := q[0]48 q = q[1:]49 inQ[v] = false50 for i, e := range g[v] {51 if e.cap == 0 {52 continue53 }54 w := e.to55 newD := dis[v] + e.cost56 if newD < dis[w] {57 dis[w] = newD58 fa[w] = vi{v, i}59 if !inQ[w] {60 inQ[w] = true61 q = append(q, w)62 }63 }64 }65 }66 return dis[end] < inf67 }68 69 minCost := 070 for spfa() {71 minF := inf72 for v := end; v != st; {73 p := fa[v]74 minF = min(minF, g[p.v][p.i].cap)75 v = p.v76 }77 for v := end; v != st; {78 p := fa[v]79 e := &g[p.v][p.i]80 e.cap -= minF81 g[v][e.rid].cap += minF82 v = p.v83 }84 minCost += dis[end] * minF85 }86 Fprint(out, minCost)87}88 8990