-
[ DP ] 개미전사알고리즘/이코테 - 실전 2021. 8. 23. 22:26
난이도 : 중 풀이시간 : 30분 시간제한 : 1초
[ DP ] 개미전사
개미 전사는 부족한 식량을 충당하고자 메뚜기 마을의 식량창고를 몰래 공격하려 한다. 메뚜기 마을엔 여러 개의 식량창고가 있는데 식량창고는 일직선으로 이어져 있다. 각 식량창고에는 정해진 수의 식량을 저장하고 있으며 개미 전사는 식량창고를 선택적으로 약탈하여 식량을 빼앗을 예정이다. 이 때 메뚜기 정찰병들은 일직선상에 존재하는 식량창고 중에서 서로 인접한 식랴창고가 공격받으면 바로 알아챌 수 있다. 따라서 개미 전사가 정찰병에게 들키지 않고 식량창고를 약탈하기 위해서는 최소한 한 칸 이상 떨어진 식량창고를 약탈해야 한다. 개미 전사를 위해 식량 창고 N개에 대한 정보가 주어질 때 얻을 수 있는 식량의 최댓값을 구하여라
:: 입력 조건
- 첫째 줄에 식량창고의 개수 N이 주어진다.(3 <= N <= 100)
- 둘째 줄에 공백으로 구분되어 각 식량창고에 저장된 식량의 개수 K가 주어진다.(0 <= K <= 1,000)
:: 출력 조건
- 첫째 줄에 개미 전사가 얻을 수 있는 식량의 최댓값을 출력하시오
내 코드
#include <iostream> #include <vector> #include <algorithm> #include <string> using namespace std; #define endl "\n" int k[101]; int dp[101]; int x; int main() { cin >> x; for (int i = 0; i < x; i++) { cin >> k[i]; } for (int i = 0; i < x; i++) { if (i == 0 || i == 1) { dp[i] = k[i]; } else if (i == 2) { dp[i] = k[i] + k[0]; } else { dp[i] = max(dp[i - 2], dp[i - 3]) + k[i]; } } cout << dp[x - 1] << endl; }
정답 코드
#include <bits/stdc++.h> using namespace std; // 앞서 계산된 결과를 저장하기 위한 DP 테이블 초기화 int d[100]; int n; vector<int> arr; int main(void) { // 정수 N을 입력받기 cin >> n; // 모든 식량 정보 입력받기 for (int i = 0; i < n; i++) { int x; cin >> x; arr.push_back(x); } // 다이나믹 프로그래밍(Dynamic Programming) 진행(보텀업) d[0] = arr[0]; d[1] = max(arr[0], arr[1]); for (int i = 2; i < n; i++) { d[i] = max(d[i - 1], d[i - 2] + arr[i]); } // 계산된 결과 출력 cout << d[n - 1] << '\n'; }
리뷰
정답코드랑 묘하게 다른데
결과는 잘 나옴
체크하는 칸은 다르지만 결론적으로 최댓값을 구하는 코드임
'알고리즘 > 이코테 - 실전' 카테고리의 다른 글
[ DP ] 효율적인 화폐 구성 (0) 2021.09.08 [ DP ] 바닥 공사 (0) 2021.08.23 [ DP ] 1로 만들기 (0) 2021.08.23 [ 이진탐색 ] 떡볶이 떡 만들기 (0) 2021.08.10 [ 이진탐색 ] 부품 찾기 (0) 2021.08.10