我是靠谱客的博主 孤独早晨,这篇文章主要介绍Rake It In ( DFS)计蒜客Rake It In,现在分享给大家,希望可以做个参考。

计蒜客Rake It In

由于k<=3,t<=200,可以想到,在最坏的情况下,暴力计算出每一层的最优解,一共也只有6层,时间最多为200*(9^6)。暴力递归(回溯)出每一层的最优解,进而求取最终答案。

复制代码
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#include <iostream> #include <cstring> #include <string> #include <cstdlib> #include <cstdio> #include <map> #include <vector> #include <algorithm> #include <cmath> #define inf 0x3f3f3f3f using namespace std; typedef long long ll; int a[5][5]; const int n = 4; int k; void cc(int i,int j) { int tmp=a[i][j]; a[i][j]=a[i][j+1]; a[i][j+1]=a[i+1][j+1]; a[i+1][j+1]=a[i+1][j]; a[i+1][j]=tmp; } void ee(int i,int j) { int tmp=a[i][j]; a[i][j]=a[i+1][j]; a[i+1][j]=a[i+1][j+1]; a[i+1][j+1]=a[i][j+1]; a[i][j+1]=tmp; } int dd(int x,int y) { return a[x][y] + a[x + 1][y] + a[x][y + 1] + a[x + 1][y + 1]; } int DFS(int num) { int ans = 0; if (num == 2 * k) { int mini = inf; for (int i = 1; i < n; i++) { for (int j = 1; j < n;j++) { mini = min(mini, dd(i, j)); } } return mini; } else if(num%2==1) { int mx = 0; for (int i = 1; i < n; i++) { for (int j = 1; j < n;j++) { cc(i, j); int sum = dd(i, j) + DFS(num + 1); mx = max(mx, sum); ee(i, j); } } return mx; } else if(num%2==0) { int mini = inf; for (int i = 1; i < n; i++) { for (int j = 1; j < n;j++) { cc(i, j); int sum = dd(i, j) + DFS(num + 1); mini = min(mini, sum); ee(i, j); } } return mini; } } int main() { int T; scanf("%d", &T); while(T--) { scanf("%d", &k); for (int i = 1; i <= n; i++) for (int j = 1; j <= n;j++) scanf("%d", &a[i][j]); printf("%dn", DFS(1)); } return 0; }

 

最后

以上就是孤独早晨最近收集整理的关于Rake It In ( DFS)计蒜客Rake It In的全部内容,更多相关Rake内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(63)

评论列表共有 0 条评论

立即
投稿
返回
顶部