かっこを追加[Baek Jun 16637]
3494 ワード
かっこを追加
演算子の優先度が同じで、左から計算する条件で括弧内に演算子が1つしかない条件なので、問題アクセスはDPでアクセスすべきだと思います.(制限時間も0.5秒まで短い)
dp[N]:N個の数値が与えられたときに括弧を付けることで得られる最大値を格納する配列.
mdp[N]:N個の数値が与えられたときに括弧を付けることで得られる最小値を格納する配列.
dp[n]は、次の3つに最大値を格納する必要があります.
計算 dp[N-1]とN番目の数字 dp[N−2]および(N,N−1の数値を計算する値)を計算する. 計算 mdp[N-2]と(N,N-1の数字を計算)->mdp[n−2]は負数(N,N−1)であり,計算は負数であり,2つの乗算は最大値に達することができる. 最初は3番の条件を考えず、間違えて質問の検索で知りました.
A.方法
演算子の優先度が同じで、左から計算する条件で括弧内に演算子が1つしかない条件なので、問題アクセスはDPでアクセスすべきだと思います.(制限時間も0.5秒まで短い)
dp[N]:N個の数値が与えられたときに括弧を付けることで得られる最大値を格納する配列.
mdp[N]:N個の数値が与えられたときに括弧を付けることで得られる最小値を格納する配列.
dp[n]は、次の3つに最大値を格納する必要があります.
計算
B.実施
C.コード
#include <iostream>
#include <vector>
#include <stdlib.h>
using namespace std;
#define ll long long
char fm[19];
// 최대값을 저장하는 배열.
vector<ll> dp;
// 최소값을 저장하는 배열.
vector<ll> mdp;
int T, N;
// 문자로 된 값과 연산자를 통해 계산하는 함수.
ll cal(ll a, ll b, char c) {
ll ret = 0;
switch(c) {
case '+':
ret = a + b;
break;
case '-':
ret = a - b;
break;
case '*':
ret = a * b;
break;
default:
//cout << "NO!" << endl;
break;
}
return ret;
}
void solver(int n) {
if(n == 0) {
dp.push_back(atoi(&fm[0]));
mdp.push_back(atoi(&fm[0]));
}
else if(n == 1) {
dp.push_back(cal(atoi(&fm[0]), atoi(&fm[2]), fm[1]));
mdp.push_back(cal(atoi(&fm[0]), atoi(&fm[2]), fm[1]));
}
else {
ll a = dp[dp.size() - 2];
ll b = dp[dp.size() - 1];
ll c = mdp[mdp.size() - 2];
ll d = mdp[mdp.size() - 1];
char oa = 2 * (n - 2) + 1;
char ob = 2 * (n - 1) + 1;
dp.push_back(max(cal(b, atoi(&fm[2 * n]), fm[ob]), cal(a, cal(atoi(&fm[2 * (n - 1)]), atoi(&fm[2 * n]), fm[ob]), fm[oa])));
dp[dp.size() - 1] = max(dp[dp.size() - 1], cal(c, cal(atoi(&fm[2 * (n - 1)]), atoi(&fm[2 * n]), fm[ob]), fm[oa]));
mdp.push_back(min(cal(d, atoi(&fm[2 * n]), fm[ob]), cal(c, cal(atoi(&fm[2 * (n - 1)]), atoi(&fm[2 * n]), fm[ob]), fm[oa])));
mdp[dp.size() - 1] = min(mdp[mdp.size() - 1], cal(a, cal(atoi(&fm[2 * (n - 1)]), atoi(&fm[2 * n]), fm[ob]), fm[oa]));
}
if(N / 2 == n)
return;
else
solver(n + 1);
}
int main() {
//scanf("%d", &T);
T = 1;
for(int tc = 0; tc < T; tc++) {
scanf("%d", &N);
scanf("%s\n", fm);
dp.clear();
mdp.clear();
solver(0);
printf("%d\n", dp[dp.size() - 1]);
}
return 0;
}
D.結果
Reference
この問題について(かっこを追加[Baek Jun 16637]), 我々は、より多くの情報をここで見つけました https://velog.io/@pamrk2002/백준-16637テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol