[[TableOfContents]] = ì˜¤ëŠ˜ì˜ ë¬¸ì œ = * [https://www.acmicpc.net/problem/2579|계단 오르기] = ì°¸ê°€ìž = * 15ì´ì›ì¤€ = 코드 = == 15ì´ì›ì¤€ == {{{ #include<iostream> #include<algorithm> using namespace std; int N; int arr[301] = { 0, }; int dp[301][3] = { 0, }; int main(){ cin>> N; for(int i = 1; i<=N; i++){ scanf("%d", &arr[i]); } if(N < 3){ int ans = 0; for(int i = 1; i<=N; i++){ ans += arr[i]; } cout<< ans << endl; return 0; } dp[1][1] = arr[1]; dp[2][1] = arr[2]; dp[2][2] = dp[1][1] + arr[2]; for(int i = 3; i<=N; i++){ dp[i][1] = max(dp[i-2][1], dp[i-2][2]) + arr[i]; dp[i][2] = dp[i-1][1] + arr[i]; } int ans = 0; ans = max(dp[N][2] , dp[N][1]); cout<< ans <<endl; } }}} == ë°•ì¸ì„œ == {{{ #include <iostream> #include <vector> #include <algorithm> std::vector<int> dp[2], st; int main() { int n; std::cin >> n; for (int i = 0; i < n; i++) { int t; std::cin >> t; st.push_back(t); } dp[0].push_back(0); dp[0].push_back(st[1]); dp[1].push_back(st[0]); dp[1].push_back(st[0] + st[1]); for (int i = 2; i < n; i++) { dp[0].push_back(std::max(dp[0][i - 2], dp[1][i - 2]) + st[i]); dp[1].push_back(dp[0][i - 1] + st[i]); } std::cout << std::max(dp[0][n - 1], dp[1][n - 1]); return 0; } }}} == ê³½ì •í == = ì•„ì´ë””ì–´ = == 15ì´ì›ì¤€ == * dp를 ì´ìš©í•˜ì—¬ 풀었습니다. * ê° ê³„ë‹¨ì˜ ìƒíƒœëŠ” ì—°ì†í•´ì„œ 1번 ë°Ÿì€ ìƒíƒœì´ê±°ë‚˜ 2번 ë°Ÿì€ ìƒíƒœì¼ 수있습니다. * 1번 ë°Ÿì€ ìƒíƒœëŠ” ë°‘ë°‘ 계단ì—서 2계단 오른 것입니다. ì´ëŠ” 3ë²ˆì—°ì† ë°ŸëŠ” 것과 ìƒê´€ì´ 없으므로 ë°‘ë°‘ 계단ì—서 ë‘ ìƒíƒœ 중 ë” í° ê°’ì„ ê°–ëŠ” ê²ƒì„ ê°€ì ¸ì™€ 현 ê³„ë‹¨ì˜ ê°’ì„ ë”ì—¬ 1번 ë°Ÿì€ ìƒíƒœì— ì €ìž¥í•©ë‹ˆë‹¤. * 2번 ë°Ÿì€ ìƒíƒœëŠ” ë°‘ 계단ì—서 1계단 오른 것입니다. ì´ëŠ” 3번 ì—°ì† ë°ŸëŠ” 것과 ìƒê´€ì´ 있으므로 ë°‘ 계단ì—서 1번 ë°Ÿì€ ìƒíƒœì˜ ê°’ì— í˜„ ê³„ë‹¨ì˜ ê°’ì„ ë”하여 2번 ë°Ÿì€ ìƒíƒœì— ì €ìž¥í•©ë‹ˆë‹¤. * ì´ë¥¼ 반복하여 ë ê³„ë‹¨ì˜ 1번 ë°Ÿì€ ìƒíƒœì™€ 2번 ë°Ÿì€ ìƒíƒœì˜ ê°’ 중 í° ê°’ì„ ì¶œë ¥í•©ë‹ˆë‹¤. == ë°•ì¸ì„œ == * Dynamic Programming {{{ * dp[k][i] - i번째 계단까지 ì˜¤ë¥´ëŠ”ë° ê·¸ ì§ì „ì— ë°‘ê³„ë‹¨ì—서 올ë¼ì™”다면 k=1, 아니면 k=0ì´ë‹¤. * dp[0][i] = max(dp[0][i-2],dp[1][i-2])+st[i] * dp[1][i] = dp[1][i-1]+st[i] }}} == ê³½ì •í ==