티스토리 뷰
728x90
문제 링크
풀이
눈물겹게 풀었습니다... 😢😢😢
$i$번 칸의 위아래 각각
1) 선택하지 않음(앞에서 오른쪽 칸을 먹은 상태)
2) 한 칸만 선택
3) 오른쪽과 함께 선택
의 3*3가지 상태와 $i$번의 위, 아래칸을 함께 선택하는 상태로 총 10가지 경우가 있습니다.
각 상태에 따라 어떤 상태로 전이할지 정해주고 DP를 돌리면 됩니다.
맵이 원형이므로 첫 칸에서 가능한 모든 경우로 다 시작해본 다음, 시작한 상태에 따라 마지막 칸에서 전이되는 상태가 유효한지 판단합니다.
예를 들어 첫 칸에서 한 칸을 선택했는데 마지막에서 오른쪽과 함께 선택하거나, 첫 칸을 선택하지 않았는데 마지막에서 오른쪽을 함께 선택하지 않는 경우 등은 유효하지 않습니다.
다른 분들 코드를 보니 훨씬 효율적으로 푼 코드가 많아보입니다.
나중에 실력이 오르면 다시 한번 더 도전해보겠습니다..
정답 코드
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
using vi = vector<int>;
using vvi = vector<vi>;
int n, w;
int p[11'111][2], d[11'111][3][4];
vvi to = {
{1, 2},
{1, 2},
{0},
{1, 2},
};
vvi cost = {
{0, 1, 1},
{1, 2, 2},
{1, 2, 2},
{0, 0, 0, 1}
};
int go(int i, int now1, int now2, int s1, int s2) {
if (now1 == 2 && p[i][0] + p[i + 1][0] > w) return INF;
if (now2 == 2 && p[i][1] + p[i + 1][1] > w) return INF;
if (now1 == 3 && p[i][0] + p[i][1] > w) return INF;
if (i == n - 1) {
if (now1 == 2 && s1 != 0) return INF;
if (now2 == 2 && s2 != 0) return INF;
if (now1 != 2 && s1 == 0) return INF;
if (now2 != 2 && s2 == 0) return INF;
return cost[now1][now2];
}
int &ret = d[i][now1][now2];
if (ret != -1) return ret;
ret = INF;
for (int next1: to[now1]) {
for (int next2: to[now2]) {
ret = min(ret, go(i + 1, next1, next2, s1, s2) + cost[now1][now2]);
}
}
if (now1 != 2 && now2 != 2)
ret = min(ret, go(i + 1, 3, 3, s1, s2) + cost[now1][now2]);
return ret;
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
int t;
cin >> t;
while (t--) {
cin >> n >> w;
memset(p, 0, sizeof(p));
for (int i = 0; i < n; i++) {
cin >> p[i][0];
}
for (int i = 0; i < n; i++) {
cin >> p[i][1];
}
p[n][0] = p[0][0];
p[n][1] = p[0][1];
int ans = INF;
for (int now1: {0, 1, 2}) {
for (int now2: {0, 1, 2}) {
memset(d, -1, sizeof(d));
ans = min(ans, go(0, now1, now2, now1, now2));
}
}
memset(d, -1, sizeof(d));
ans = min(ans, go(0, 3, 3, 3, 3));
cout << ans << '\n';
}
}
728x90
'알고리즘 > 문제 풀이' 카테고리의 다른 글
[BOJ] 백준 1019 - 책 페이지 (0) | 2021.03.13 |
---|---|
[BOJ] 백준 2618 - 경찰차 (0) | 2021.03.13 |
[BOJ] 백준 5893 - 17배 (0) | 2021.03.11 |
[BOJ] 백준 1014 - 컨닝 (0) | 2021.03.11 |
[BOJ] 백준 1256 사전 (0) | 2021.03.10 |
댓글