https://www.acmicpc.net/problem/14888
백준 14888번 문제 연산자 끼워넣기 풀이이다.
N값이 크지 않으므로 dfs를 통한 완전탐색으로 문제를 해결할 수 있다.
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll, ll> pll;
int arr[12];
int n;
//returns (min, max) value
pll dfs(ll lval, int index, int plus, int minus, int mult, int div) {
if (index >= n) return make_pair(lval, lval);
ll rmin = 9876543210000LL;
ll rmax = -9876543210000LL;
ll rval = (ll)arr[index];
if (plus > 0) {
pll ret = dfs(lval + rval, index+1, plus-1, minus, mult, div);
rmin = min(rmin, ret.first);
rmax = max(rmax, ret.second);
}
if (minus > 0) {
pll ret = dfs(lval - rval, index+1, plus, minus-1, mult, div);
rmin = min(rmin, ret.first);
rmax = max(rmax, ret.second);
}
if (mult > 0) {
pll ret = dfs(lval * rval, index+1, plus, minus, mult-1, div);
rmin = min(rmin, ret.first);
rmax = max(rmax, ret.second);
}
if (div > 0) {
pll ret = dfs(lval / rval, index+1, plus, minus, mult, div-1);
rmin = min(rmin, ret.first);
rmax = max(rmax, ret.second);
}
return make_pair(rmin, rmax);
}
int main() {
cin >> n;
for (int i=0; i <n; i++) {
cin >> arr[i];
}
int a,b,c,d;
cin >> a >> b >> c >> d;
pll ans = dfs(arr[0], 1, a, b, c, d);
cout << ans.second << '\n' << ans.first << endl;
return 0;
}
'알고리즘 & Problem Solving' 카테고리의 다른 글
백준 14890번 경사로 풀이 (0) | 2018.04.22 |
---|---|
백준 14889번 스타트와 링크 문제 풀이 (0) | 2018.04.22 |
2차원 누적합, 부분합 구하기 (0) | 2018.04.14 |
백준저지 2133번 타일 채우기 문제 풀이 (0) | 2018.03.25 |
[수학] 나머지(Modulo) 연산 (1) (2) | 2018.02.20 |