https://www.acmicpc.net/problem/2313
λ¬Έμ
보μ κ°κ²μ μ¬λ¬ κ°μ§μ 보μμ΄ μ§μ΄λμ΄ μλ€. κ°κ°μ 보μμ μ μλ‘ ννλλ κ°μΉκ° μλ€. λλ‘λ μ μ£Όλ°μ 보μμ΄ μκΈ° λλ¬Έμ κ°μΉκ° μμκ° λ μλ μλ€.
보μλ€μ μ΄ nκ°μ μ€μ λμ΄λμ΄ μλ€. μ΄μ λΉμ μ κ°κ°μ μ€μμ λͺ κ°μ 보μμ ꡬ맀νλ € νλ€. μ΄λ, κ° μ€μμ 보μμ ꡬ맀ν λ μ°μμ μΈ λ³΄μλ€μ ꡬ맀ν΄μΌ νλ€. μ¦, μ΄λ ν μ€μμ 1, 2λ² λ³΄μμ ꡬ맀ν μλ μκ³ , 2, 3λ² λ³΄μμ ꡬ맀ν μλ μμ§λ§, 1, 3λ² λ³΄μμ ꡬ맀ν μλ μλ€.
ꡬ맀νλ 보μμ κ°μΉμ μ΄ ν©μ΄ μ΅λκ° λλλ‘ λ³΄μμ ꡬ맀νλ λ°©λ²μ μ°Ύμλ΄λ νλ‘κ·Έλ¨μ μμ±νμμ€.
μ λ ₯
첫째 μ€μ μ μ n(1 ≤ n ≤ 1,000)μ΄ μ£Όμ΄μ§λ€. λ€μ 2×nκ°μ μ€μλ nκ°μ μ€μ λμ΄λ 보μλ€μ λν μ λ³΄κ° μ£Όμ΄μ§λ€. λ¨Όμ κ° μ€μ λμ΄λ 보μμ κ°μ L(1 ≤ L ≤ 1,000)μ΄ μ£Όμ΄μ§κ³ , κ·Έ λ€μ μ€μ Lκ°μ μ μλ€μ΄ μ£Όμ΄μ§λ€. κ° μ μλ κ° λ³΄μμ κ°μΉλ₯Ό λνλΈλ€. 보μμ κ°μΉλ μ λκ°μ΄ 10,000λ³΄λ€ μκ±°λ κ°μ μ μμ΄λ€.
μΆλ ₯
첫째 μ€μ 보μμ κ°μΉμ μ΄ ν©μ μ΅λκ°μ μΆλ ₯νλ€. λ€μ nκ°μ μ€μλ, μ€μμ λͺ λ²μ§Έ 보μλΆν° λͺ λ²μ§Έ 보μκΉμ§λ₯Ό ꡬ맀νλμ§λ₯Ό μΆλ ₯νλ€.
λ§μ½ μ΅λκ° λλ κ²½μ°κ° μ¬λΏμ΄λ©΄, ꡬ맀ν 보μλ€μ μ΄ κ°μκ° μ΅μκ° λλ λ°©λ²μ μΆλ ₯νλ€. μ΄μ κ°μ κ²½μ°λ μ¬λΏμ΄λΌλ©΄, μΆλ ₯ν n×2κ°μ μλ€μ νλμ μμ΄λ‘ μκ°νμ¬, μ¬μ μμΌλ‘ κ°μ₯ μμ μ€λ κ²½μ°λ₯Ό μΆλ ₯νλ€.
νμ΄
μ λ ₯ 쑰건μ 보면 보μ κ°μΉμ μ΄ ν©μ
μ΅λ n*L*(보μμ κ°μΉ μ΅λκ°) = 1000*1000*10000 = 10,000,000,000 = 100μ΅
23μ΅μ νμ°Έ λκΈ°λ―λ‘ intκ° μλ long longμΌλ‘ ν΄μΌνλ€
보μ κ° μ€λ§λ€ dp μ°μ°μ λ 립μ μΌλ‘ μ§ννμ§λ§
μΆλ ₯ 첫 μ€μ μ΅μ’ μΌλ‘ λμ¨ κ°μ 보μ¬μ€μΌνκΈ° λλ¬Έμ
μ λ ₯μ μ λΆ λ€ λ°μμ μ μ₯ν΄λκ³ μμν΄μΌνλ€. (νμλ vλΌλ 벑ν°λ₯Ό μ¬μ©νλ€)
dp[i] : 보μκ°―μ, iλ²μ§ΈκΉμ§μ μ΅λν©
// dp
vector<ci>dp(length); // dp[i] : 보μκ°―μ, iλ²μ§ΈκΉμ§μ μ΅λν©
dp[0] = {1, v[i][0]};
for(int j=1; j<length; j++) {
ci before = dp[j-1];
if(before.second<=0) {
dp[j] = {1, v[i][j]};
} else {
dp[j] = {before.first+1, before.second+v[i][j]};
}
}
λΉκ΅ μ‘°κ±΄μ΄ κΉλ€λ‘λ€.
1. 보μμ κ°μΉμ ν©μ΄ μ΅λκ° λμ΄μΌν¨
2. κ°μΉμ ν©μ΄ κ°λ€λ©΄ -> 보μμ κ°―μκ° μ μ΄μΌν¨
3. κ°μΉλ κ°κ³ κ°―μλ κ°λ€λ©΄ -> κ·Έλλ§ μμͺ½μΈκ±°
// μ΅λκ° λλ 첫λ²μ§Έ μμΉ κ΅¬νκΈ°
int index = 0;
int cnt = dp[index].first;
int max_value = dp[index].second;
for(int j=1; j<length; j++) {
if(dp[j].second>=max_value) {
if(dp[j].second==max_value && dp[j].first>=cnt) {
continue;
}
index = j;
max_value = dp[j].second;
cnt = dp[j].first;
}
}
κ²μνμ μΉμ ν λ°λ‘ λͺ¨μμ΄ μλ€.
μλ κΈμ λμμλ λ°λ‘λ₯Ό λ€ μ±κ³΅νλ©΄ κ±°μ μ±κ³΅μ΄λ€
https://www.acmicpc.net/board/view/139927
μ½λ
// νμ΄ : https://whkakrkr.tistory.com
#include <iostream>
#include <vector>
using namespace std;
typedef long long ll;
typedef pair<int, int> ci;
int main() {
// μ
λ ₯
int n;
cin >> n;
vector<vector<int>>v(n);
for(int i=0; i<n; i++) {
int tmp;
cin >> tmp;
v[i] = vector<int>(tmp);
for(int j=0; j<tmp; j++) {
cin >> v[i][j];
}
}
// νμ΄
ll sum = 0;
vector<ci> ans(n);
for(int i=0; i<n; i++) {
int length = v[i].size();
// dp
vector<ci>dp(length); // dp[i] : 보μκ°―μ, iλ²μ§ΈκΉμ§μ μ΅λν©
dp[0] = {1, v[i][0]};
for(int j=1; j<length; j++) {
ci before = dp[j-1];
if(before.second<=0) {
dp[j] = {1, v[i][j]};
} else {
dp[j] = {before.first+1, before.second+v[i][j]};
}
}
// μ΅λκ° λλ 첫λ²μ§Έ μμΉ κ΅¬νκΈ°
int index = 0;
int cnt = dp[index].first;
int max_value = dp[index].second;
for(int j=1; j<length; j++) {
if(dp[j].second>=max_value) {
if(dp[j].second==max_value && dp[j].first>=cnt) {
continue;
}
index = j;
max_value = dp[j].second;
cnt = dp[j].first;
}
}
sum += max_value;
ans[i] = {index+1-cnt+1, index+1};
}
// μΆλ ₯
cout << sum << "\n";
for(ci i : ans) {
cout << i.first << " " << i.second << "\n";
}
return 0;
}
'ποΈ ICPC Sinchon > Dynamic Programming' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[BOJ][C++] λ°±μ€ 2421λ²: μ κΈν΅ (0) | 2024.09.24 |
---|---|
[BOJ][C++] λ°±μ€ 1577λ²: λλ‘μ κ°μ (0) | 2024.09.16 |
[BOJ][C++] λ°±μ€ 4883λ²: μΌκ° κ·Έλν (0) | 2024.09.13 |
[BOJ][C++] λ°±μ€ 2688λ²: μ€μ΄λ€μ§ μμ (0) | 2024.09.06 |
[BOJ][C++] λ°±μ€ 1904λ²: 01νμΌ (0) | 2024.08.25 |