728x90
반응형
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<vector>
using namespace std;
#define NS 11
int map[NS][NS];
int D[NS][NS];
int N, M, C;
int ret;
int ret1[3];
struct Data {
int y; int x;
};
vector<Data>v[3];
struct Honey {
Honey() {
int T;
scanf("%d", &T);
for (int t = 1; t <= T; t++) {
init();
scanf("%d %d %d", &N, &M, &C);
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
scanf("%d", &map[i][j]);
}
}
dfs(0, 0,1);
printf("#%d %d\n", t, ret);
}
}
void init() {
memset(map, 0, sizeof(map));
memset(D, 0, sizeof(D));
for (int i = 1; i < 3; i++) {
ret1[i] = 0x80000000;
} for (int i = 0; i <= 2; i++) {
v[i].clear();
}
ret = 0x80000000;
}
void copy(int map[NS][NS], int cmap[NS][NS]) {
for (int i = 0; i < NS; i++) {
for (int j = 0; j < NS; j++) {
cmap[i][j] = map[i][j];
}
}
}
bool safe(int y, int x) {
return 0 <= y && y < N && 0 <= x && x < N;
}
bool able(int y,int x,int idx) {
for (int i = 0; i < M; i++) {
if (safe(y, x)&&D[y][x]==0) {
D[y][x++] = idx;
}
else return 0;
}
return 1;
}
void gainHoney() {
for (int i = 0; i < 3; i++) {
v[i].clear();
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (D[i][j] != 0) {
v[D[i][j]].push_back({ i, j });
}
}
}
for (int i = 1; i < 3; i++) {
ret1[i]=0x80000000;
}
dfs(0,0,0,1);//일번 벌꿀
dfs(0,0,0,2);//이번 벌꿀
if (ret < ret1[1] + ret1[2])ret = ret1[1] + ret1[2];
}
void dfs(int idx,int sum,int finalSum, int num) {//idx 1에 대해서
if (idx == M) {
if (sum <= C) {
if (ret1[num] < finalSum)ret1[num] = finalSum;
}
return;
}
dfs(idx + 1, sum + map[v[num][idx].y][v[num][idx].x],finalSum+((map[v[num][idx].y][v[num][idx].x])*(map[v[num][idx].y][v[num][idx].x])),num);
dfs(idx + 1, sum,finalSum,num);
}
void dfs(int y, int x, int idx) {
if (idx == 3) {
gainHoney();
return;
}
int cmap[NS][NS] = { 0, };
for (int i = y; i < N; i++) {
for (int j = x; j < N; j++) {
copy(D,cmap);
if (able(i,j,idx)) {
dfs(y , x + 1, idx + 1);
}
copy(cmap, D);
}
x = 0;
}
}
}Honey;
int main(void) {
return 0;
}
매소드를 오버리딩하면서 그냥 문제를 구현했는데 오버리딩이 중요한것이 아니고
이묹는 일단 포인트는 연구소 문제를 풀었다면 그 구역을 설정하는 방식이 있는데 그방식을 이용해서 벌집을 선택을
1 1 2 2
0 0 0 0
0 0 0 0
1 1 0 0
2 2 0 0
0 0 0 0
1 1 0 0
0 2 2 0
0 0 0 0
이렇게 구역 설정을 할 줄 알아야합니다. 그리고 그 구역에 대해서 부분 수열의 합중 C이하이고
C이하인것중에 제곱의 합의 최댓값이 얼마인지 구하는 문제로 우선 저렇게 dfs 재귀를 이용해서 모든 경우를 세워주고
부분수열의 경우도
5 개의 0 0 0 0 0
이면 1인것의 배열의 값을 더한다 했을때
1 0 0 0 0
0 1 0 0 0
0 0 1 0 0
0 0 0 1 0
0 0 0 0 1
1 1 0 0 0
이런식으로 모든 경우를 더해봐야 합니다. 그래도 또 한개의 dfs를 두고 부분수열의 합을 구했습니다.
그렇게해서 그냥 최댓값을 뽑아내면 되는 문제 정말 쉽지 않나요? 여러분들도 도전해보세요 안되시면 질문 해주세요
728x90
반응형
'알고리즘 모음집 > 알고리즘 (Algorithm)' 카테고리의 다른 글
21611 마법사 상어와 블리자드 (0) | 2021.05.02 |
---|---|
아기상어, 드래곤 커브(동물 알고리즘) (0) | 2021.04.19 |
1952. [모의 SW 역량테스트] 수영장 (0) | 2020.02.29 |
1258 행렬찾기 (0) | 2020.02.27 |
1225 암호 생성기 (0) | 2020.02.27 |
댓글