[문제]
https://www.acmicpc.net/problem/16637
[풀이]
dfs를 이용해서 풀 수 있다.
괄호를 묶는 경우, 현재 idx와 idx+2 가 피연산자가 되고, idx+1이 연산자가 된다. 따라서 이들의 계산 값과 현재 값을 계산해준 결과를 curr에 담아 dfs를 호출하는데, 이때 idx는 idx+4가 된다.
괄호를 묶지 않는 경우의 idx는 idx+2가 되며 curr에는 현재 idx와 이전 curr을 계산한 결과를 넘겨준다.
[코드]
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <cstring>
#include <cmath>
#include <stack>
#define INF 987654321
using namespace std;
int n;
string s;
int ans = -987654321;
int calculate(int a, int b, char op){
switch(op){
case '+': a+=b; break;
case '-': a-=b; break;
case '*': a*=b; break;
}
return a;
}
void dfs(int idx, int curr){
//종료 조건
if(idx>=n){
ans = max(ans, curr);
return;
}
char op = idx == 0 ? '+' : s[idx-1];
//괄호를 묶는 경우
if(idx+2 < n){
int temp = calculate(s[idx]-'0', s[idx+2]-'0', s[idx+1]);
dfs(idx+4, calculate(curr, temp, op));
}
//괄호를 안묶는 경우
dfs(idx+2, calculate(curr, s[idx]-'0', op));
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
//괄호를 적절히 추가해 얻을 수 있는 식의 최대값
cin >> n >> s;
dfs(0, 0);
cout << ans;
}
'알고리즘 공부 및 문제 풀이 > 백준(BOJ)' 카테고리의 다른 글
[boj] 백준 2629 양팔저울 (c++) - dp, 재귀 (1) | 2022.11.22 |
---|---|
[boj] 백준 10159 저울 (c++) - 플로이드-와샬 (0) | 2022.11.17 |
[boj] 백준 17779 게리맨더링2 (c++) - 브루트포스, 구현 (0) | 2022.11.10 |
[boj] 백준 2812 크게 만들기 (c++) - deque (1) | 2022.11.03 |
[boj] 백준 11437 LCA (c++) - LCA (0) | 2022.11.03 |