문제정리)
- 시작은 계단으로 치지 않는다.
- 한계단 또는 두계단 씩 오를 수 있다.
- 연속되게 세개의 계단을 밟을 수 없다.
- 계단을 밟을때마다 점수가 오른다.
- 마지막 계단은 반드시 밟아야한다.
- 얻을 수 있는 점수의 최대값을 구하라.
문제풀이)
dp[계단의번호][1] => 지금 계단을 바로 전 계단에서 한 칸 오르는 경우의 최대 값
dp[계단의번호][2] => 지금 계단을 바로 전전 계단에서 두 칸 오르는 경우의 최대 값
초기 계단의 번호 0 과 1은 값을 지정해 준다.
dp[1][1] = arr[1]; dp[1][2] = 0;
dp[2][2] = arr[1] + arr[2]; dp[1][2] = arr[2];
3번 계단부터는 점화식을 통해 dp를 수행한다.
dp[i][1] => 지금 계단을 한 칸으로 오른 경우
dp[i][1] = dp[i-1][2] + arr[i]; => 전 칸까지 2칸으로 오른 경우의 최대 값에 지금 계단의 값을 더함
dp[i][2] => 지금 계단을 두 칸으로 오른 경우
dp[i][2] = max(dp[i-2][1], dp[i-2][2]) + arr[i] => 두 칸 전까지 오른 경우의 최대 값에 지금 계단의 값을 더함
'알고리즘문제풀이' 카테고리의 다른 글
2668_숫자고르기 (0) | 2015.04.09 |
---|---|
더블릿_더큰 (0) | 2015.04.08 |
더블릿_이진 검색 (0) | 2015.04.06 |
도블릿_rank sort (0) | 2015.04.06 |
더블릿_소인수분해 (0) | 2015.04.03 |