2023.12.9 总结
T1
题意:一枚棋子每一步只能走到与它原位置不同行与不同列的位置,现在将其放在一个 \(R\) 行 \(C\) 列的棋盘中,此棋子走 \(N\) 步,经过的点构成一个排列,问有多少种不同排列?\((R,C,N \le 200)\)
初步思路此题是 \(DP\) 。
设 \(f_{i,j,u}\) 为走了 \(i\) 步,在 \(j,u\) 位置的走法,每一次一个一个点转移,时间复杂度 \(O(NR^2C^2)\) 。
反着考虑,每走一步先求整个棋盘的总方案,再减去同行同列的方案,时间复杂度为 \(O(NR^2C+NRC^2)\) 。
用前缀和优化,时间复杂度为 \(O(NRC)\) 。
T2
题意:一个 \(n\) 点 \(m\) 边的无向图,共 \(k\) 种颜色,编号为 \(1\) 到 \(k\) ,对这些点染色,相邻的点的颜色编号和不能为 \(z\) ,问有多少种方案?$ (n,m \le 18 ,k,z\le 10^9)$
\(n,m\) 很小,从 \(n,m\) 角度考虑。
考虑容斥,每次钦定一些边矛盾,并查集处理,套容斥公式即可。
时间复杂度 \(O(2^mn)\) 。
T3
题意:求有多少个数既为 \(N\) 的倍数,又为 \(S\) 的子串。\((|S| \le 5000,N \le 1000)\)
考虑 \(DP\) 。
设 \(f_{i,j}\) 为处理到第 \(i\) 位,除 \(N\) 余 \(j\) 的数有多少个,直接 \(DP\) 处理即可,答案即为 \(\sum_{1 \le i \le |S|} f_{i,0}\) 。
但是这样会出现重复的数,若一个数在 \(S\) 中出现了两次,就会记重。
我们可以这样做,\(DP\) 状态加一个 \(0\) 到 \(9\) ,表示最后一位,初始化不在 \(0\) 而在每一位初始化。
这样就可以做到去重。
T4
不会