[λ°±μ€/C++] 16457λ² λ¨νμ μ΄μΌκΈ°
π€λ¬Έμ μ΄ν΄
κ° νμ€νΈλΉ νμν μ€ν¬μ λ€ μ¬μ©κ°λ₯ν λ κ·Έ νμ€νΈλ₯Ό κΉ° μ μλ€. 2nκ°μ μ€ν¬ μ€ nκ°λ§ 골λμ λ μ΅λλ‘ λ§μ΄ κΉ° μ μλ νμ€νΈμ κ°μλ₯Ό μΆλ ₯νλ©΄ λλ€.
쑰건
ν€μ κ°μ : n
νμ€νΈμ κ°μ : m (1 ~ 100)
νμ€νΈ λΉ μ€ν¬ μ : k (1 ~ n)
μ€ν¬μ λ²νΈ ( 1~2n)
π₯νμ΄π₯
2nκ°μ μ€ν¬ μ€ λ°°μΉν μ€ν¬ nκ°λ₯Ό 골λμ λ κΉ° μ μλ νμ€νΈμ κ°μ μ€ κ°μ₯ ν° κ°μ μΆλ ₯νκ² νλ€.
λ³μ
- quest[i] : iλ²μ§Έ νμ€νΈμμ νμν μ€ν¬μ λ²νΈλ₯Ό λΉνΈλ‘ νν
μ¬κ·ν¨μ void Solve(int i, int d, int cnt)
- νμ¬ μν : νμ¬κΉμ§ μ ν μ€ν¬μ λΉνΈλ‘ λνλ΄λ i, λͺλ²μ§Έ μ€ν¬κΉμ§ μ²λ¦¬ν΄μ€¬λμ§λ₯Ό λνλ΄λ d, μ ν μ€ν¬μ κ°μ cnt
- λ€μ μν : dλ² μ€ν¬μ μ¬μ© or dλ² μ€ν¬μ μ¬μ©νμ§ μμ
- μ§μ μν : μ무κ²λ μ νμ§ μμ μνμ΄κ³ 1λ² μ€ν¬λΆν° 골λΌμΌ νλ―λ‘ Solve(0, 1, 0)
- μ’ λ£ μν : cntκ° nμΌ λ, μ¦ nκ°μ μ€ν¬μ 골λμ λ return
- dλ² μ€ν¬μ μ¬μ©νκ² λλ€λ©΄ iμ ν΄λΉ μ€ν¬ λ²νΈμ λΉνΈλ₯Ό μΌμ€(1λ‘ λ§λ€μ΄μ€λ€)
ν¨μ void CountQuest(int x)
- κ° νμ€νΈμμ νμν μ€ν¬μ μ 보μ μ ν nκ°μ μ€ν¬μ AND μ°μ°ν κ°μ΄ νμν μ€ν¬μ μ 보μ μΌμΉνλ€λ©΄ κΉ° μ μλ νμ€νΈμ μλ₯Ό +1
- λͺ¨λ νμ€νΈμ λΉκ΅ ν μΆλ ₯ν λ³μ ansμ λΉκ΅ν΄ λ ν° κ°μ ansμ μ μ₯
βοΈ νκΈ°
λ¬Έμ μ μ λ ₯μ΄ μ΄λ»κ² λ€μ΄μ€λμ§ μ λλ‘ νμΈνμ§ μμμ 3λ²μ΄λ νλ Έλ€.
#include <iostream>
#include <vector>
using namespace std;
int n, m, k, a;
int quest[102];
int ans;
void CountQuest(int x) {
int cnt = 0;
for (int i = 0; i < m; i++) {
if ((quest[i] & x) == quest[i]) {
cnt++;
}
}
ans = max(ans, cnt);
}
void Solve(int i, int d, int cnt) {
if (cnt == n) {
CountQuest(i);
return;
} else if (d == 2 * n + 1) return;
else {
Solve(i, d + 1, cnt);
i = i | (1 << d);
Solve(i, d + 1, cnt + 1);
}
}
int main() {
cin.tie(nullptr);
cout.tie(nullptr);
ios::sync_with_stdio(false);
cin >> n >> m >> k;
for (int i = 0; i < m; i++) {
for (int j = 0; j < k; j++) {
cin >> a;
quest[i] = quest[i] | (1 << a);
}
}
Solve(0, 1, 0);
cout << ans;
}