본문 바로가기

ProgramSoliving

백준 : 16639 괄호추가하기 3

반응형

문제유형 : dp

dp[i][j]는 i~j구간의 최대값, 최소값을 구한다.

각구간에 대한 최소값과 최대값을 구한다. ( a - b) 음수구간때문에 최소값을 뺄때가 최대값일 수 있음.

package boj;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

public class Boj16639 {
	static int N;
	static int dpMax[][];
	static int dpMin[][];

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int N = Integer.parseInt(br.readLine());

		String str = br.readLine();
		// init
		dpMax = new int[N][N];
		dpMin = new int[N][N];
		for (int i = 0; i < N; i += 2) {
			for (int j = 0; j < N; j += 2) {
				dpMax[i][j] = Integer.MIN_VALUE;
				dpMin[i][j] = Integer.MAX_VALUE;
			}
		}

		for (int i = 0; i < N; i += 2) {
			dpMax[i][i] = dpMin[i][i] = str.charAt(i) - '0';
		}

		for (int k = 2; k < N; k += 2) {
			for (int i = 0; i < N - k; i += 2) {
				// i ~ i+k 최대값 최소 계산
				int candidates[] = new int[4];
				for (int j = i + 1; j < i + k; j += 2) {
					char ch = str.charAt(j);
					candidates[0] = Calculate(dpMax[i][j - 1], dpMax[j + 1][i + k], ch);
					candidates[1] = Calculate(dpMax[i][j - 1], dpMin[j + 1][i + k], ch);
					candidates[2] = Calculate(dpMin[i][j - 1], dpMax[j + 1][i + k], ch);
					candidates[3] = Calculate(dpMin[i][j - 1], dpMin[j + 1][i + k], ch);

					Arrays.sort(candidates);
					dpMax[i][i + k] = Math.max(dpMax[i][i + k], candidates[3]);
					dpMin[i][i + k] = Math.min(dpMin[i][i + k], candidates[0]);
				}
			}
		}
		System.out.println(dpMax[0][N - 1]);
	}

	static int Calculate(int a, int b, char c) {
		if (c == '+') {
			return a + b;
		} else if (c == '-') {
			return a - b;
		} else if (c == '*') {
			return a * b;
		}
		return 0;
	}
}

www.acmicpc.net/problem/16639

 

16639번: 괄호 추가하기 3

길이가 N인 수식이 있다. 수식은 0보다 크거나 같고, 9보다 작거나 같은 정수와 연산자(+, -, ×)로 이루어져 있다. 곱하기의 연산자 우선순위가 더하기와 빼기보다 높기 때문에, 곱하기를 먼저 계

www.acmicpc.net

 

 

반응형

'ProgramSoliving' 카테고리의 다른 글

백준 : 14466 소가 길을 건넌 이유  (0) 2021.04.12
백준 : 1800 인터넷 설치 JAVA  (0) 2021.04.07
백준 : 18500 미네랄  (0) 2021.04.05
백준 : 17780 새로운게임  (0) 2021.04.05
백준 : 10021 Watering the Fields  (0) 2021.04.04