Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | |||||
| 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| 10 | 11 | 12 | 13 | 14 | 15 | 16 |
| 17 | 18 | 19 | 20 | 21 | 22 | 23 |
| 24 | 25 | 26 | 27 | 28 | 29 | 30 |
| 31 |
Tags
- 16974
- 13905
- 브루트포스
- 최소 스패닝 트리
- 파사드패턴
- 오늘의 문제
- 알고리즘특강
- pushswap
- born2beroot
- 42서울 #개발 #대외활동
- 이미지저장
- 삼성전자 dx 알고리즘 특강
- 레벨 햄버거
- 최소지식원칙
- 다이나믹 프로그래밍
- 삼성b형
- 자바
- 9465
- 도시 분할 계획
- 분할정복
- 삼성전자dx
- 42서울
- 16719
- festify
- 18869
- 3967
- 19951
- 백준
- gdg스터디
- 이미지삭제
Archives
- Today
- Total
그거 기능이에요
백준 9465 스티커 본문
문제 설명

- 상근이의 여동생인 상냥이가 해당 스티커를 사 왔는데, 스티커 한 장을 떼면 그 스티커와 변을 공유하는 스티커는 사용할 수 없다고 한다.
- 각 스티커마다 점수를 매겼는데 여기서 점수의 합이 최대가 되도록 스티커를 떼는 경우를 구하고자 한다.
- 가장 높은 점수를 구해라!!
문제 접근
- 합을 구하는데 조건이 있으니까 DP다!!
- 변을 접하지 않는 애들 중에서 가장 큰 값과 더하면 되겠구나
- 변을 접하지 않는 애들 : 한 칸 앞 대각선, 두 칸 앞에 있는 스티커 위 아래 두 장.
- 세 칸 앞 이상은 고려하지 않아도 되는 이유 : 세 칸 앞의 스티커와 바로 다음으로 현재 스티커를 고르면 사이의 두 칸에서는 아무 스티커도 고르지 않는다는 가정인데, 이렇게 되면 세 칸 앞의 스티커 하나와 그 대각선에 있는 두 칸 앞 스티커 하나와 내 현재 스티커를 고르는 경우가 무조건 더 크게 되므로 고려하지 않아도 된다.
코드
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
int T, n;
cin>>T;
while (T--)
{
int dp[2][100001];
int input[2][100001];
int ret = 0;
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 100001; j++)
{
dp[i][j] = 0;
input[i][j] = 0;
}
}
cin>>n;
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < n; j++)
{
cin>>input[i][j];
}
}
dp[0][0] = input[0][0];
dp[1][0] = input[1][0];
// 핵심 로직 반복문
for (int j = 1; j < n; j++)
{
for (int i = 0; i < 2; i++)
{
if (i == 0)
{
if (j > 1)
dp[i][j] = max(dp[i + 1][j - 1], max(dp[i + 1][j - 2], dp[i][j - 2])) + input[i][j];
else
dp[i][j] = dp[i + 1][j - 1] + input[i][j];
}
else
{
if (j > 1)
dp[i][j] = max(dp[i - 1][j - 1], max(dp[i - 1][j - 2], dp[i][j - 2])) + input[i][j];
else
dp[i][j] = dp[i - 1][j - 1] + input[i][j];
}
}
}
ret = max(dp[0][n - 1], dp[1][n - 1]);
cout<<ret<<endl;
}
return (0);
}
느낀 점
- DP는 감이 잘 안 잡혀서 항상 어려웠던 분류였는데 이제 조금 감이 잡힌다는 느낌이 들었다.
- DP는 큰 문제를 작은 문제로 쪼개서 푸는 게 가장 큰 포인트라고 배웠었는데, 내 생각에는 이전의 계산 결과를 이용해서 최적의 결과를 만드는 게 중요한 포인트 같다.
- 배열을 활용한 메모이제이션으로 연산 횟수를 줄이고 이 과정을 하려면 큰 문제를 작은 문제로 쪼개서 생각해야 하는 것 같다.
'백준 > 오늘의 문제' 카테고리의 다른 글
| 백준 빌런 호석 22251 (4) | 2024.12.26 |
|---|---|
| 백준 14950 정복자 (3) | 2024.12.22 |
| 백준 18869 멀티버스 2 (7) | 2024.12.21 |
| 백준 19951 태상이의 훈련소 생활 (3) | 2024.12.18 |
| 백준 16719 ZOAC (0) | 2024.12.17 |