728x90
시간 제한 : 1초
메모리 제한 : 128MB
입력
첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스의 첫째 줄에는 n (1 ≤ n ≤ 100,000)이 주어진다. 다음 두 줄에는 n개의 정수가 주어지며, 각 정수는 그 위치에 해당하는 스티커의 점수이다. 연속하는 두 정수 사이에는 빈 칸이 하나 있다. 점수는 0보다 크거나 같고, 100보다 작거나 같은 정수이다.
출력
각 테스트 케이스 마다, 2n개의 스티커 중에서 두 변을 공유하지 않는 스티커 점수의 최댓값을 출력한다.
소스코드
#include <iostream> #include <vector> using namespace std; int max(int a, int b) { return a < b ? b : a; } int main(void) { int t, n, ans; cin >> t; while (t--) { vector<vector<int> > arr(2), dp(2); cin >> n; for (int i = 0; i < 2; i++) { arr[i] = vector<int>(n+1, 0); dp[i] = vector<int>(n+1, 0); } for (int i = 0; i < 2; i++) { for (int j = 1; j <= n; j++) { cin >> arr[i][j]; dp[i][j] = arr[i][j]; } } for (int i = 2; i <= n; i++) { dp[0][i] = dp[0][i] + max(dp[1][i - 1], dp[1][i - 2]); dp[1][i] = dp[1][i] + max(dp[0][i - 1], dp[0][i - 2]); } ans = max(dp[0][n], dp[1][n]); cout << ans << '\n'; } }
Tip
동적계획법 문제로, 2차원 배열을 그려서 어떤 경우가 존재하는지 따져보면 수월하게 풀 수 있다. 스티커를 하나 선택하면 상하좌우는 선택할 수 없고, 대각선 방향만 선택이 가능한데, 대각선 방향은 물론이고 대각선의 옆 방향도 선택할 수 있다는 점을 고려해야 한다.
dp[0][i] = dp[0][i] + max(dp[1][i - 1], dp[1][i - 2]);
dp[1][i] = dp[1][i] + max(dp[0][i - 1], dp[0][i - 2]);
728x90
'Computer Science > Algorithm Problem' 카테고리의 다른 글
백준] 6160 - Election Time(USACO 2008) (0) | 2018.10.30 |
---|---|
백준] 13163 - 닉네임에 갓 붙이기(UCPC 2016) (0) | 2018.10.30 |
백준] 14490 - 백대열(선린인터넷고등학교 교내대회) (0) | 2018.10.17 |
백준] 13752 - 히스토그램(ACM-ICPC Regionals) (0) | 2018.10.17 |
백준] 2154 - 수 이어 쓰기3(COCI 2004) (0) | 2018.10.09 |