문제 링크 : https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5V4A46AdIDFAWu
알고리즘
각 칸마다 구할 수있는 최대값 을 구한뒤 제약사항을 주의 하며 합새거 가장 높은 경우를 출력.
코드
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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
|
#include<iostream>
#include<algorithm>
using namespace std;
int N, M, C;
int map[11][11];
int ans1 = 0, ans2 = 0;
int arr[5];
bool sel[5];
int max_num = 0;
int square() {
int sum = 0;
for (int i = 0; i < M; i++) {
if (sel[i] == true) {
sum = sum + arr[i] * arr[i];
}
}
return sum;
}
int Sum() {
int sum = 0;
for (int i = 0; i < M; i++) {
if (sel[i] == true) {
sum += arr[i];
}
}
return sum;
}
//벌통 선택
void pick(int y, int x) {
int idx = 0;
for (int i = x; i < x + M; i++) {
arr[idx++] = map[y][i];
}
}
void DFS(int idx, int cnt) {
//벌통의 갯수보다 많이탐색할수 없다 .
if (cnt > M)return;
//최대 수확량보다 많으면 return
if (cnt > 0) {
if (Sum() > C)return;
//최댓값 갱신
max_num = max(max_num, square());
}
for (int i = idx; i < M; i++) {
if (sel[i] == true) continue;
sel[i] = true;
DFS(i, cnt + 1);
sel[i] = false;
}
}
void reset() {
for (int i = 0; i < 5; i++) {
sel[i] = false;
arr[i] = 0;
}
}
void func() {
int y = 0;
int x = 0;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N-M; j++) {
pick(i, j);
DFS(0, 0);
if (max_num > ans1) {
ans1 = max_num;
y = i;
x = j;
}
}
}
reset();
max_num = 0;
for (int i = 0; i < N; i++) {
for (int j = 0; j <= N - M; j++) {
if (y == i && j == x) {
j += M;
continue;
}
pick(i, j);
DFS(0, 0);
ans2 = max(max_num, ans2);
}
}
reset();
max_num = 0;
}
int main() {
int T;
cin >> T;
for (int k = 1; k <= T; k++) {
cin >> N >> M >> C;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
cin >> map[i][j];
}
}
func();
cout << "#" << k << " " << ans1 + ans2 << "\n";
ans1 = 0;
ans2 = 0;
}
}
|
cs |
개인적으로 SW EXPERT 문제는 설명이 부족한부분이 많아서 별로인거같다 기출이기 때문에 풀어보는것..