Skip to content

Commit 76da199

Browse files
committed
[2300] CF327E 状压 DP
1 parent 151cafc commit 76da199

File tree

2 files changed

+74
-0
lines changed

2 files changed

+74
-0
lines changed

main/300-399/327E.go

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package main
2+
3+
import (
4+
. "fmt"
5+
"io"
6+
)
7+
8+
// 另一种效率更高的做法是折半枚举,见 https://codeforces.com/blog/entry/8274
9+
10+
// github.com/EndlessCheng/codeforces-go
11+
func CF327E(in io.Reader, out io.Writer) {
12+
const mod int = 1e9 + 7
13+
var n, k int
14+
Fscan(in, &n)
15+
m := 1 << n
16+
sum := make([]int, m)
17+
for i := 0; i < n; i++ {
18+
Fscan(in, &sum[1<<i])
19+
}
20+
b := [2]int{}
21+
Fscan(in, &k, &b[0], &b[1])
22+
f := make([]int, m)
23+
f[0] = 1
24+
for s := 1; s < m; s++ {
25+
lb := s & -s
26+
v := sum[s^lb] + sum[lb]
27+
if v > 1e9+1 {
28+
v = 1e9 + 1
29+
}
30+
sum[s] = v
31+
if v != b[0] && v != b[1] {
32+
dv := 0
33+
for sub, lb := s, 0; sub > 0; sub ^= lb {
34+
lb = sub & -sub
35+
dv += f[s^lb]
36+
if dv >= mod {
37+
dv -= mod
38+
}
39+
}
40+
f[s] = dv
41+
}
42+
}
43+
Fprint(out, f[1<<n-1])
44+
}
45+
46+
//func main() { CF327E(os.Stdin, os.Stdout) }

main/300-399/327E_test.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package main
2+
3+
import (
4+
"github.com/EndlessCheng/codeforces-go/main/testutil"
5+
"testing"
6+
)
7+
8+
// https://codeforces.com/problemset/problem/327/E
9+
// https://codeforces.com/problemset/status/327/problem/E
10+
func TestCF327E(t *testing.T) {
11+
// just copy from website
12+
rawText := `
13+
inputCopy
14+
3
15+
2 3 5
16+
2
17+
5 7
18+
outputCopy
19+
1
20+
inputCopy
21+
3
22+
2 2 2
23+
2
24+
1 3
25+
outputCopy
26+
6`
27+
testutil.AssertEqualCase(t, rawText, 0, CF327E)
28+
}

0 commit comments

Comments
 (0)