문제
- 문제 링크
BOJ 28422 - XOR 카드 게임
1. 한 번에 가져가는 카드들에 적혀있는 번호를 XOR 연산한다.
2. 1에서 구한 값을 이진수로 변환했을 때, 1의 개수만큼 점수를 획득한다.
N장의 카드 더미가 위에서부터 주어진다.
위 획득 기준으로 카드를 두 장 혹은 세 장씩 가져갈 때, 획득할 수 있는 최고 점수를 구해보자.
TL : 1 sec, ML : 1024 MB
1≤N≤105 20≤Ai≤210
알고리즘 분류
- 다이나믹 프로그래밍(dp)
풀이
간단한 dp 문제이다.
dp[i]: 지금까지 i장의 카드를 가져갔을 때, 이후 획득할 수 있는 최고 점수.
문제에서 제시하는 분기 방향 그대로,
임의의 i에서 2장의 카드를 가져갈 때 / 3장의 카드를 가져갈 때 중 최댓값을 취하면 된다.
N장의 카드를 정확히 가져가지 못하면 0점 처리되므로, 이를 유의하자.
전체 코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | #include<bits/stdc++.h> using namespace std; int n, a[100005], dp[100001]; int f(int p) { if (p > n - 2) return p ^ n ? -1e9 : 0; int& t(dp[p]); if (!~t) t = max(f(p + 2) + __builtin_popcount(a[p + 1] ^ a[p + 2]), f(p + 3) + __builtin_popcount(a[p + 1] ^ a[p + 2] ^ a[p + 3])); return t; } int main() { cin >> n; for (int i(1); i <= n; scanf("%d", &a[i++])); memset(dp, -1, sizeof dp); cout << max(0, f(0)); } | cs |
comment
끝
'Problem Solving > Baekjoon Online Judge (Gold)' 카테고리의 다른 글
백준 28421 - 곱하기와 쿼리 (C++) (0) | 2023.08.05 |
---|---|
백준 28426 - 더하기와 나누기 (C++) (0) | 2023.08.04 |
백준 28333 - 화이트 칼라 (C++) (0) | 2023.07.20 |
백준 14757 - Dueling Philosophers (C++) (1) | 2023.07.16 |
백준 25978 - 2차원 배열 다중 업데이트 다중 합 (C++) (0) | 2023.07.11 |