347 words
2 minutes
[BOJ] 발전소
TimeLimit | MemoryLimit | Condition | TAG |
---|---|---|---|
2s | 128MB | (1 ≤ N ≤ 16, 0 ≤ P ≤ N, 0 ≤ cost ≤ 36) | Dynamic Programming |
그냥 간단한 bit masking dp였네용. 이제는 범위가 작기만하면 bit masking 생각나서 금방 접근하는거 같아요. 재밌었습니다.
정답 코드
#include <iostream>
#include <queue>
#include <vector>
#include <algorithm>
#include <set>
#include <map>
#include <sstream>
#include <iomanip>
#include <string>
#include <numeric>
#include <unordered_set>
#include <unordered_map>
#include <climits>
using namespace std;
using ll = unsigned long long;
//ll MOD = 1'000'000'007;
ll MOD = 1.8446744074E19;
int N;
int power_stations[20][20];
int dp[1 << 16];
// 이것도 뭐 bit masking 때리면 되는 놈인데? 그러고 dp[i]는 그냥 코스트로 해보지 뭐
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cin >> N;
for(int i = 0; i < N; i++){
for(int j = 0; j < N; j++)
cin >> power_stations[i][j];
}
int state = 0;
for(int i = 0; i < N; i++){
char current;
cin >> current;
if(current == 'Y') state |= 1 << i;
}
int p;
cin >> p;
for(int i = 0; i < 1 << N; i++){
dp[i] = 1000000000;
}
dp[state] = 0;
for(int current = state; current < 1 << N; current++){
if(dp[current] == 1000000000) continue;
for(int i = 0; i < N; i++){
if(!(current & 1 << i)) continue;
for(int j = 0; j < N; j++){
if(i == j) continue;
dp[current | 1 << j] = min(dp[current | 1 << j], dp[current] + power_stations[i][j]);
}
}
}
int result = 1000000000;
for(int i = 0; i < 1 << N; i++){
int cnt = 0;
if(dp[i] == 1000000000) continue;
for(int j = 0; j < N; j++){
cnt += (i & (1 << j)) ? 1 : 0;
}
if(cnt >= p) result = min(result, dp[i]);
}
if(result == 1000000000) cout << -1;
else cout << result;
return 0;
}