λμ΄λ : 골λ 3
κ±Έλ¦° μκ° : 50λΆ
λ¬Έμ
νμ΄
μ²μμ νμ΄λ₯Ό μ΄μνκ² μκ°ν΄μ O(n^3)μ μμ νμ νΉμ DPλ₯Ό μ¬μ©νλ λ²μ μκ°νκ³ μμλ€. κ·Έλ¬λ€κ° μκ°μ λ€μ ν΄λ³΄λ μ½κ² ν μ μλ λ°©λ²μ΄ μμ΄ 20λΆλ§μ νκ² λμλ€. μμ μ²μμ νμ΄λ₯Ό μ£ΌμμΌλ‘ μ μ μ΄λ³Έ ν μμ λ₯Ό ν
μ€νΈ ν΄λ³΄κ³ μννλ κ²μ΄ μ μΌ μ ννκ³ μλ§μ λ°©λ²μΈ λ― νλ€.
μ λ ₯μ λ²μλ 10^3λ‘ κ·Έλ€μ§ λμ νΈμ μλμμ§λ§, μμ νμ μ O(n^3)μ΄ κ±Έλ¦¬λ―λ‘ μΆ©λΆν μκ°μ΄κ³Όκ° λμ¬ μ μλ λ²μμλ€. λν κ° μ«μμ λ²μλ μ΅λ 10^3μ΄λ―λ‘ μ«μλ₯Ό νλμ© λ΄λ €κ°λ©° / μ¬λ €κ°λ©° νΈλ μμ νμ λν λΆκ°λ₯νλ€.
μμ μ ννΈλ₯Ό 보λ μ°μμ μ΄μ§ μμ μμ΄μ νλ¦λ κ°λ₯νκ³ , κ·Έλ λ€λ©΄ κ° μ«μκ° λ³΄μ νκ³ μλ max κ°μ κ°±μ μν€λ μμΌλ‘ λμνλ©΄ λμ§ μμκΉ μκ°νλ€.
- μμ΄μ΄ μ€λ₯΄λ ꡬκ°μ λ°λΌκ°λ©΄μ κ°μ§ μ μλ max lengthλ₯Ό μ μ₯νλ€.
- ex_) 1 2 4 3 μμ 3κ³Ό 4λ λͺ¨λ 1 2 4 3 / 1 2 4 3 κ³Ό κ°μ΄ 3 κΈΈμ΄μ μ€λ¦μ°¨μ μμ΄μ κ°μ§ μ μμΌλ―λ‘ λ λ€ max lengthκ° 3μ΄λ€.
- μ€λ₯΄λ ꡬκ°μ μ¬λ¬ κ²½μ°μ μκ° λμ¬ μ μμΌλ―λ‘ μ¬κ·ν¨μλ₯Ό μ΄μ©νμ¬ κ΅¬ννλ€.
- μμ΄μ λ°λνΈμμ μ€λ₯΄λ κ΅¬κ° (μ€μ λ‘λ λ΄λ¦Όμ°¨μ ꡬκ°)μ λ°λΌκ°λ©΄μ max lengthλ₯Ό μ μ₯νλ€.
- λ lengthμ ν©μ΄ maxμΈ κ²μ κ³ λ₯Έ ν 1μ λΉΌμ€λ€.
- 1 5 2 1 4 3 4 5 2 1 μμ 5κ° κ°μ§ lengthλ μΌμͺ½μμ μ¨ 5μ μ€λ₯Έμͺ½μμ μ¨ 3μ΄λ€. λ°λΌμ 5 μμ μ΄ λλ² μΉ΄μ΄νΈ λμμΌλ―λ‘ 1μ λΉΌμ€ κ²μ΄ μ λ΅μ΄λ€.
μ½λ
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> vec; // μμ΄
vector<pair<int, int>> memo; // up, down
void goingUp(int start, int num, int& n) {
for (int i = start+1; i < n; i++) {
if (vec[start] < vec[i]) {
if (memo[i].first < (num + 1)) {
memo[i].first = num + 1;
goingUp(i, num + 1, n);
}
}
}
}
void goingReverse(int start, int num, int& n) {
for (int i = start -1 ; i >= 0; i--) {
if (vec[start] < vec[i]) {
if (memo[i].second < (num + 1)) {
memo[i].second = num + 1;
goingReverse(i, num + 1, n);
}
}
}
}
int main() {
// μ
λ ₯ λ°κΈ°
int n; // μμ΄μ ν¬κΈ°
cin >> n;
for (int i = 0; i < n; i++) {
int tmp;
cin >> tmp;
vec.push_back(tmp);
memo.push_back(make_pair(0, 0));
}
// iλ₯Ό νλμ© λλ €κ°λ©΄μ
// μμμ λ€λ‘
// μ¬κ·ν¨μλ‘ μ¦κ°νλ©΄μ μ«μ κΈ°λ‘νκΈ° (ν° κ±Έλ‘)
// λ°λμͺ½λ γ±γ±
for (int i = 0; i < n; i++) {
if (memo[i].first == 0)
memo[i].first = 1;
goingUp(i, 1, n);
if (memo[i].second == 0)
memo[i].second = 1;
goingReverse(n-i-1, 1, n);
}
int max = 0;
for (int i = 0; i < n; i++) {
int res = memo[i].first + memo[i].second;
if (res > max)
max = res;
}
cout << max - 1;
}
'Algorithm λ¬Έμ > BOJ' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[c++] BOJ 1520 :: λ΄λ¦¬λ§κΈΈ (0) | 2021.03.12 |
---|---|
[c++] BOJ 12865 :: νλ²ν λ°°λ (0) | 2021.03.12 |
[c++] BOJ 13023 :: ABCDE (ν μ€νΈμΌμ΄μ€, μ½λ) (0) | 2020.05.06 |
[c++] BOJ 1393λ² :: μνμ² λ ꡬꡬν (μ½λ, μ£Όμν μ , ν μ€νΈμΌμ΄μ€) (0) | 2020.05.02 |
[c++] BOJ 1107λ² :: 리λͺ¨μ»¨ (μ½λ, ν μ€νΈμΌμ΄μ€) (0) | 2020.05.02 |
Comment