시간초과, columnFlip의 시간을 줄이면 되지 않을까 ?
시간초과, 아예 다른 방법이 필요하다
#include <stdio.h>
#include <vector>
using namespace std;
vector<vector<bool>> V;
vector<vector<bool>> check;
int N, M, K;
int ANS;
int input;
void columnFlip(vector<vector<bool>> &V, int idx) {
for (int i = 0; i < N; i++) {
V[i][idx] = !V[i][idx];
}
}
void findAnswer(vector<vector<bool>> V, vector<vector<bool>> check, int depth) {
if (depth == K) {
int countVal = 0;
for (int i = 0; i < N; i++) {
bool rightON = true;
for (int j = 0; j < M; j++) {
if (V[i][j] == 0) {
rightON = false;
break;
}
}
if (rightON)
countVal++;
}
if (countVal > ANS)
ANS = countVal;
return ;
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if (check[i][j] == 0) {
columnFlip(V, i);
check[i][j] = 1;
findAnswer(V, check, depth+1);
columnFlip(V, i);
check[i][j] = 0;
}
}
}
}
int main(void)
{
freopen("input_1.txt", "r", stdin);
scanf("%d %d", &N, &M);
V.resize(N);
check.resize(N);
for (int i = 0; i < N; i++) {
V[i].resize(M);
check[i].resize(M);
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
scanf("%1d", &input);
if (input == 0)
V[i][j] = 0;
else
V[i][j] = 1;
}
}
scanf("%d", &K);
findAnswer(V, check, 0);
printf("%d\n", ANS);
return 0;
}
#include <iostream>
#include <string>
using namespace std;
string input;
int N, M, K;
long long bits[50];
int ANS;
void BFS(bool check[50][50], int depth) {
if (depth == K) {
int countVal = 0;
for (int i = 0; i < N; i++) {
bool rightON = true;
for (int j = 0; j < M; j++) { // 같은 행의 비트가 전부 1인지 비교
if (!(bits[j] & (1 << i))) {
rightON = false;
break;
}
}
if (rightON) // 전부 켜져 있다면 count
countVal++;
}
if (countVal > ANS)
ANS = countVal;
return;
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if (check[i][j] == 0) {
bits[i] = ~bits[i]; // 해당 열 bit flip
check[i][j] = 1;
BFS(check, depth+1);
bits[i] = ~bits[i];
check[i][j] = 0;
}
}
}
}
int main(void)
{
bool check[50][50] = {{0,},};
freopen("input_1.txt", "r", stdin);
cin >> N >> M;
for (int i = 0; i < N; i++) {
cin >> input;
for (int j = 0; j < M; j++) {
if (input[j] == '1')
bits[j] |= (1 << i);
}
}
cin >> K;
BFS(check, 0);
cout << ANS << endl;
return 0;
}
N, M = map(int, input().split())
bits = []
ANS = 0
string = ''
for i in range(N):
string = input()
bits.append(string)
K = int(input())
for i in range(K, -1, -2):
lst = []
for j in range(N):
if i == bits[j].count('0'):
lst.append(bits[j])
if len(lst) != 0:
ANS = max(ANS, max([lst.count(s) for s in lst]))
print(ANS)