T2 AcWing 4868. 数字替换

思路:

DFS剪枝

  • 搜索顺序优化
  • 最优性优化
  • 预测最优性优化
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
#include<iostream>
#include<cstring>
#include<algorithm>

using namespace std;

typedef long long LL;

LL num, n;
int ans = 1000;

void dfs(int u, LL num)
{
// 记录当前位数和记录出现的数字
int cnt = 0;
int st[10] = {0};
for(LL i = num; i; i /= 10)
{
st[i % 10] = 1;
cnt++;
}

// 最优性剪枝, 如果当前步数 + 剩余位数 大于最优解停止当前分支
if(u + n - cnt >= ans) return;

// 终止条件
if(cnt == n)
{
ans = u;
return;
}

// 搜索顺序优化, 优先从大到小遍历数字
for(int i = 9; i > 1; i--)
if(st[i])
dfs(u + 1, num * i);
}

int main()
{
cin >> n >> num;
dfs(0,num);
if(ans == 1000) ans = -1;
cout << ans;
return 0;
}

T3 AcWing 4869. 异或值

思路

Trie树