文章
4
粉丝
0
获赞
1
访问
94
由于这道题的 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;...
登录后发布评论
暂无评论,来抢沙发