728x90
스티커
https://www.acmicpc.net/problem/9465
<코드>
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 | #include <stdio.h> int stiker[2][100010]; int dp[2][100010]; int max(int a, int b) { return a > b ? a : b; } int main(void){ int testcase; scanf("%d", &testcase); while (testcase--){ int n; scanf("%d", &n); for (int i = 0; i < 2; i++) for (int j = 2; j <= n+1; j++) scanf("%d", &stiker[i][j]); for (int i = 2; i <= n+1; i++){ dp[0][i] = max(max(dp[0][i - 1], dp[1][i - 1] + stiker[0][i]), dp[1][i - 2] + stiker[0][i]); dp[1][i] = max(max(dp[1][i - 1], dp[0][i - 1] + stiker[1][i]), dp[0][i - 2] + stiker[1][i]); } if (dp[0][n+1] > dp[1][n+1]) printf("%d\n", dp[0][n+1]); else printf("%d\n", dp[1][n+1]); } return 0; } | cs |
<문제 푼 요령>
1. 이 문제는 현재의 쭈욱 검색해 나가면서 스티커를 붙일경우와 붙이지 않을경우의 최대값을 비교해주면 된다.
2. 각 포인트를 비교해줘야 할 요소는 3가지이다. 그 요소는 아래 그림과 같다. 즉 스티커를 선택 안했을 경우는 이전의 값과 스티커를 선택했을 때 대각선의 값 그리고 마지막으로 스티커를 선택 할 경우 이전 이전의 대각선 값을 비교해야 한다.
3. 2번에서 비교한 값중 최대값을 넣어준다. 이 방식을 반복하면서 채워나가면 마지막에 채워진 값중에서 최대값이 최대 스티커 값이 되는 것이다.
728x90
'Algorithm > DP(동적 계획법)' 카테고리의 다른 글
[백준][2133번][DP] 타일 채우기 (0) | 2016.04.12 |
---|---|
[백준][1520번][DP] 내리막길 (8) | 2016.04.12 |
[Dovelet][DP] 01knapsack (0) | 2016.04.12 |
[백준][2240번][DP] 자두나무 (0) | 2016.04.11 |
[백준][9095번][DP] 1,2,3 더하기 (3) | 2016.04.10 |
댓글