forked from EndlessCheng/codeforces-go
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path1409F.go
65 lines (61 loc) · 1.11 KB
/
1409F.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
package main
import (
. "fmt"
"io"
"strings"
)
// github.com/EndlessCheng/codeforces-go
func CF1409F(in io.Reader, out io.Writer) {
var n, K int
var s, t string
Fscan(in, &n, &K, &s, &t)
if t[0] == t[1] {
c := strings.Count(s, t[:1]) + K
if c > n {
c = n
}
Fprint(out, c*(c-1)/2)
return
}
I := func(b bool) int {
if b {
return 1
}
return 0
}
max := func(a, b int) int {
if a > b {
return a
}
return b
}
dp := make([][][]int, n)
for i := range dp {
dp[i] = make([][]int, K+1)
for j := range dp[i] {
dp[i][j] = make([]int, n+1)
for k := range dp[i][j] {
dp[i][j][k] = -1
}
}
}
var f func(p, left, c0 int) int
f = func(p, left, c0 int) (res int) {
if p == n {
return
}
dv := &dp[p][left][c0]
if *dv >= 0 {
return *dv
}
defer func() { *dv = res }()
res = I(s[p] == t[1])*c0 + f(p+1, left, c0+I(s[p] == t[0])) // 不修改
if left > 0 {
res = max(res, f(p+1, left-1, c0+1)) // 修改成 t[0]
res = max(res, c0+f(p+1, left-1, c0)) // 修改成 t[1]
}
return
}
Fprint(out, f(0, K, 0))
}
//func main() { CF1409F(os.Stdin, os.Stdout) }