文章

4

粉丝

0

获赞

1

访问

94

头像
记忆化搜索 错位排列 题解:
P5226 中国科学技术大学2024年机试题
发布于2026年2月26日 15:48
阅读数 20

由于这道题的 n 不是很大, 写回溯也是够用的。
这里我采用记忆化搜索, 真的很方便, 有兴趣的可以 1:1翻译成递推
其中 定义dfs(i, j) 表示 [0, i] 位上, 已有掩码 j 的情况下, 能够获得的最多的 【错排】

掩码 j = j | (1 << d), 其中 d 为选取的位置, 用掩码记录的话, 能够做到O(1)时间查询 当前状态下, 哪些数字未被使用
 

#include <iostream>
#include <vector>
#include <algorithm>
#include <math.h>
#include <queue>
#include <stack>
#include <unordered_map>
#include <unordered_set>
#include <functional>

using namespace std;

int main(void) {
	int n;
	cin >> n;
	
	vector<vector<int>> memo(n, vector<int>((1 << 10), -1)); // 用掩码记录使用否, 共10位数字
	// dfs(i, j) 表示 [0, i] 位上, 已有掩码 j 的情况下, 能够获得的最多的 【错排】
	function<int(int, int)> dfs = [&](int i, int j) -> int {
		// 递归出口
		if (i < 0) return 1;
		
		int & res = memo[i][j];
		if (res != -1) return res;
		
		res = 0;
		for (int d = 1; d <= n; d++) {
			if (d == i + 1) continue;...
登录查看完整内容


登录后发布评论

暂无评论,来抢沙发