728x90
반응형
#include<stdio.h>
#include<iostream>
#include<vector>
#include<string.h>
using namespace std;
#define NS 15
#define MS 22
int ret;
int N, M, K;
int input[NS][MS];
int Min = 0x7fffffff;//
bool chkFilm() {
int C = 0;
for (int x = 0; x < M; x++) {
if (x != C)return false;
for (int y = 0; y < N-1; y++) {
int cnt = 1;
for (int cy = y + 1; cy < N; cy++) {
if (input[y][x] == input[cy][x])cnt++;
else {
break;
}
if (cnt == K)break;
}
if (cnt >= K) {
C++;
break;
}
}
}
if (C == M)return true;
else return false;
}
void pushFill(int idx,int type) {
for (int i = 0; i < M; i++) {
input[idx][i] = type;
}
}
void copy(int idx,int cinput[MS]) {
for (int j = 0; j < M; j++) {
cinput[j] = input[idx][j];
}
}
void recopy(int idx, int cinput[MS]) {
for (int j = 0; j < M; j++) {
input[idx][j] = cinput[j];
}
}
void dfs(int idx, int cnt) {
if (cnt > Min)return;
if (idx == N) {
if (chkFilm()) {//성능을 통과하면
Min = Min > cnt ? cnt : Min;
}
return;
}
int cinput[MS];
copy(idx,cinput);//복사해놓기
dfs(idx + 1, cnt);
pushFill(idx,0);
dfs(idx + 1, cnt+1);//A약품 투입
pushFill(idx, 1);
dfs(idx + 1, cnt+1);//B약품 투입
recopy(idx, cinput);// 복원시키기
}
void init() {
memset(input, 0, sizeof(input));
Min = 0x7fffffff;
scanf("%d %d %d", &N, &M, &K);
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
scanf("%d", &input[i][j]);
}
}
dfs(0, 0);
}
int main(void) {
int T;
scanf("%d", &T);
for (int t = 1; t <= T; t++) {
init();
printf("#%d %d\n", t, Min);
}
return 0;
}
많이어려운 문제는 아닌데 잘못구현을 하게 되면 시간초과가 납니다. 그래서 진짜 잘구현해야하는데
저기 시간에 영향을 주는 d>Min 은 꼭 기억하고 해줘야 가지치기가 잘되서 진짜거의 100배 빨라집니다.
주의해주세요.
728x90
반응형
'알고리즘 모음집 > 알고리즘 (Algorithm)' 카테고리의 다른 글
프로그래머스 - 2020 KAKAO BLIND RECRUITMENT 블록 이동하기 (0) | 2019.11.14 |
---|---|
백준 17780 새로운 게임 (0) | 2019.11.14 |
백준 17779 게리맨더링2 (0) | 2019.11.13 |
백준 17822 원판돌리기 (0) | 2019.11.12 |
알고리즘 카카오 - 비밀지도, 캐시, 프렌즈4블록 (0) | 2019.11.08 |
댓글