https://www.acmicpc.net/problem/1744
#include <iostream>
#include <vector>
#include <algorithm>
#define fastio() ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
using namespace std;
int N;
vector<int> lis;
vector<int> dp;
void input();
long long dfs(int i, int val);
int main() {
fastio();
input();
cout << dfs(0, 0);
return 0;
}
void input() {
cin >> N;
lis = vector<int>(N);
dp = vector<int>(N + 1);
for (int i = 0; i < N; i++) cin >> lis[i];
sort(lis.begin(), lis.end(), greater<>());
}
long long dfs(int i, int val) {
if (i == N) return val;
else if (i == N - 1) return val + lis[i];
else {
if (dp[i]) return dp[i] + val;
else {
dp[i] = max(dfs(i + 1, val + lis[i]),
dfs(i + 2, val + lis[i] * lis[i + 1])) - val;
return dp[i] + val;
}
}
}
|
cs |
다이나믹 프로그래밍입니다.
풀이:
1. 큰 수끼리 더하는 것 보다 곱하면, 큰 수가 나올 확률이 높습니다.
그렇지만 가장 큰 수 두개가 100, -1 일 경우 곱하면 -100이 나옵니다.
그래서 반드시 그리디 하게 곱하면 안된다는 것이 명확합니다.
2. 모든 경우의 수를 구합니다.
하지만 브루트 포스의 경우 O(2^n)의 시간 복잡도라 시간 초과가 됩니다.
3. 다이나믹 프로그래밍을 사용합니다.
이미 구한 답을 사용하여 시간복잡도를 극적으로 상승 시킵니다.
'백준(C, C++) > 골드' 카테고리의 다른 글
백준 2015: 수들의 합 4 [C/C++] (0) | 2022.06.16 |
---|---|
백준 1405: 미친 로봇 [C/C++] (0) | 2022.06.16 |
백준 2668: 숫자 고르기 [C언어], 정보올림피아드 (0) | 2022.06.15 |
백준 17070: 파이프 옮기기 1 [C/C++], 삼성 코딩 테스트 (0) | 2022.06.13 |
백준 12100: 2048(Easy) [C언어], 삼성 코딩 테스트 (0) | 2022.06.13 |