[Softeer][Lv3] 조립라인

Yunho Jung·2023년 11월 3일
0

Softeer

목록 보기
5/5

소스 코드

#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])

0개의 댓글