백준 9465 스티커
9465번: 스티커
문제 상근이의 여동생 상냥이는 문방구에서 스티커 2n개를 구매했다. 스티커는 그림 (a)와 같이 2행 n열로 배치되어 있다. 상냥이는 스티커를 이용해 책상을 꾸미려고 한다. 상냥이가 구매한 스티커의 품질은 매우 좋지 않다. 스티커 한 장을 떼면, 그 스티커와 변을 공유하는 스티커는 모두 찢어져서 사용할 수 없게 된다. 즉, 뗀 스티커의 왼쪽, 오른쪽, 위, 아래에 있는 스티커는 사용할 수 없게 된다. 모든 스티커를 붙일 수 없게된 상냥이는 각 스티커에 점
www.acmicpc.net
dp문제 2차원 dp로 풀었다.
한번뗀 스티커의 오른쪽 왼쪽 아래쪽은 사용할 수 없다.
dp[n][0] => n번째 행의 스티커를 안뗀 경우 dp[n][1] => n번째 행의 스티커를 뗀 경우
그래서 처음에는 지그재그로 다 떼면 어차피 양수니까 최대한 많이 뗄 수록 좋다고 생각했는데
예제로 나온 테스트 케이스를 보면서 깨달은게 마지막에 떼는 스티커의 점수가 매우 크면
지그재그로 2개뗀거 보다 더 클 수도 있다.
그래서 max(dp[i - 2][0], dp[i - 2][1], dp[i - 1][1]) 이런식으로 비교해주었음
그렇게 푸니까 정답
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | #include <iostream> using namespace std; int max(int a, int b, int c) { int max = a; if (max < b) max = b; if (max < c) max = c; return max; } int main(void) { int t; int s[2][100001]; int dp[100001][2]; cin >> t; while (t--) { int n; cin >> n; for (int i = 0; i < 2; ++i) { for (int j = 1; j <= n; ++j) cin >> s[i][j]; } dp[1][0] = s[0][1]; dp[1][1] = s[1][1]; if (n > 1) { dp[2][0] = dp[1][1] + s[0][2]; dp[2][1] = dp[1][0] + s[1][2]; int max_dp = dp[2][0] > dp[2][1] ? dp[2][0] : dp[2][1]; for (int i = 3; i <= n; ++i) { dp[i][0] = max(dp[i - 2][0], dp[i - 2][1], dp[i - 1][1]) + s[0][i]; if (max_dp < dp[i][0]) max_dp = dp[i][0]; dp[i][1] = max(dp[i - 2][0], dp[i - 2][1], dp[i - 1][0]) + s[1][i]; if (max_dp < dp[i][1]) max_dp = dp[i][1]; } cout << max_dp << endl; } else cout << (dp[1][0] > dp[1][1] ? dp[1][0] : dp[1][1]) << endl; } return 0; } | cs |
'알고리즘 > BOJ' 카테고리의 다른 글
백준 1541 잃어버린 괄호 (0) | 2019.12.25 |
---|---|
백준 2960 에라토스테네스의 체 (1) | 2019.12.04 |
백준 2138 전구와 스위치 (0) | 2019.12.02 |
백준 1212 8진수 2진수 (0) | 2019.12.02 |
백준 14720 우유 축제 (2) | 2019.12.02 |