#include <iostream>
#include <vector>
#include <algorithm>
#define endl "\n"
using namespace std;
int n; // 작업장의 수
vector<int> a; // A 작업대의 작업시간
vector<int> b; // B 작업대의 작업시간
vector<int> a2b; // A에서 B 작업대로의 이동시간
vector<int> b2a; // B에서 A 작업대로의 이동시간
vector<pair<int, int>> d; // 작업 최소시간 dp 테이블
void print(const vector<int>& arr) {
for (const auto& i : arr) cout << i << " ";
cout << endl;
}
void printPair(const vector<pair<int, int>>& arr) {
for (const auto& pii : arr) cout << pii.first << ", " << pii.second << " ";
cout << endl;
}
void input() {
cin >> n;
a = vector<int>(n + 1, 0);
b = vector<int>(n + 1, 0);
a2b = vector<int>(n, 0);
b2a = vector<int>(n, 0);
d = vector<pair<int, int>>(n + 1, make_pair(0, 0));
int ai, bi, a2bi, b2ai;
for (int i = 1; i < n; ++i) {
cin >> ai >> bi >> a2bi >> b2ai;
a[i] = ai;
b[i] = bi;
a2b[i] = a2bi;
b2a[i] = b2ai;
}
cin >> ai >> bi;
a[n] = ai;
b[n] = bi;
}
void solve() {
d[1].first = a[1];
d[1].second = b[1];
for (int i = 2; i <= n; ++i) {
d[i].first = min(d[i - 1].first + a[i], d[i - 1].second + b2a[i - 1] + a[i]);
d[i].second = min(d[i - 1].second + b[i], d[i - 1].first + a2b[i - 1] + b[i]);
}
cout << min(d[n].first, d[n].second) << endl;
}
int main(int argc, char** argv) {
ios_base::sync_with_stdio(0);
cin.tie(0);
input();
solve();
return 0;
}
[dp 테이블 정의]
d[i].first = i번째 A작업대를 포함한 최소 조립시간
d[i].second = i번째 B작업대를 포함한 최소 조립시간+++
[초기조건]
d[1].first = a[1], d[1].second = b[1]+++
[점화식]
d[i].first = min(d[i - 1].first + a[i], d[i - 1].second + b2a[i - 1] + a[i])
d[i].second = min(d[i - 1].second + b[i], d[i - 1].first + a2b[i - 1] + b[i])