250x250
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 백준#BOJ#1939#중량제한
- 백준#boj#16932#모양만들기
- 백준#BOJ#12865#평범한배낭
- 백준#boj#12755
- 백준#BOJ#2615#오목
- 백준#BOJ#8012#한동이는영업사원
- 백준#BOJ#14501#퇴사#브루트포스
Archives
- Today
- Total
순간을 성실히, 화려함보단 꾸준함을
[ boj : 14722 ] 우유 도시 본문
https://www.acmicpc.net/problem/14722
해설 : 딸기우유->초코우유->바나나우유 순으로 먹어야 되는데, 꼭 인접한 위치에 있는 우유를 먹을 필요가 없습니다. 따라서 단순한 2차원 테이블로는 해결할 수가 없죠.
바로 위의 우유를 마지지 않더라도 지금까지 먹은 우유중에 가장 최근에 먹은 우유가 순서에 적합하다면 카운트를 시켜줘야 하니까요. 따라서 3차원 테이블로 이를 표현할 수 있습니다.
dp[i][j][k] = (i,j)에 위치하고 지금까지 먹은 우유 중 가장 최근에 마신 우유가 k 일때 최대값
그러면 현재 내가 딸기우유가 위치해 있는 좌표에 도달했다면 MAX(지금까지 가장 최근에 딸기우유를 마셨을때 최대값, 지금까지 바나나우유를 최근에 마셨을때 최대값 +1 ) 이 되겠네요.
#include<bits/stdc++.h>
using namespace std;
int n;
int board[1000][1000],dp[1000][1000][3];
int go(int x, int y);
int main()
{
cin >> n;
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++) {
cin >> board[i][j];
if (board[i][j] == 0)
dp[i][j][0] = 1;
}
for(int i=0;i<n;i++)
for (int j = 0; j < n; j++) {
if (i == 0) {
dp[i][j][0] = max(dp[i][j][0], dp[i][j - 1][0]);
dp[i][j][1] = max(dp[i][j][1], dp[i][j - 1][1]);
dp[i][j][2] = max(dp[i][j][2], dp[i][j - 1][2]);
if (board[i][j] == 0) {
if (dp[i][j - 1][2] != 0)dp[i][j][0] = max(dp[i][j][0], dp[i][j - 1][2] + 1);
}
else if (board[i][j] == 1) {
if (dp[i][j - 1][0] != 0)dp[i][j][1] = max(dp[i][j][1], dp[i][j - 1][0] + 1);
}
else {
if (dp[i][j - 1][1] != 0)dp[i][j][2] = max(dp[i][j][2], dp[i][j - 1][1] + 1);
}
}
else if (j == 0) {
dp[i][j][0] = max(dp[i][j][0], dp[i - 1][j][0]);
dp[i][j][1] = max(dp[i][j][1], dp[i - 1][j][1]);
dp[i][j][2] = max(dp[i][j][2], dp[i - 1][j][2]);
if (board[i][j] == 0) {
if (dp[i - 1][j][2] != 0)dp[i][j][0] = max(dp[i][j][0], dp[i - 1][j][2] + 1);
}
else if (board[i][j] == 1) {
if (dp[i - 1][j][0] != 0)dp[i][j][1] = max(dp[i][j][1], dp[i - 1][j][0] + 1);
}
else {
if (dp[i - 1][j][1] != 0)dp[i][j][2] = max(dp[i][j][2], dp[i - 1][j][1] + 1);
}
}
else {
dp[i][j][0] = max(dp[i][j][0], max(dp[i - 1][j][0], dp[i][j - 1][0]));
dp[i][j][1] = max(dp[i][j][1], max(dp[i - 1][j][1], dp[i][j - 1][1]));
dp[i][j][2] = max(dp[i][j][2], max(dp[i - 1][j][2], dp[i][j - 1][2]));
if (board[i][j] == 0) {
if (dp[i - 1][j][2] != 0)dp[i][j][0] = max(dp[i][j][0], dp[i - 1][j][2] + 1);
if (dp[i][j - 1][2] != 0)dp[i][j][0] = max(dp[i][j][0], dp[i][j - 1][2] + 1);
}
else if (board[i][j] == 1) {
if (dp[i - 1][j][0] != 0)dp[i][j][1] = max(dp[i][j][1], dp[i - 1][j][0] + 1);
if (dp[i][j - 1][0] != 0)dp[i][j][1] = max(dp[i][j][1], dp[i][j - 1][0] + 1);
}
else {
if (dp[i - 1][j][1] != 0)dp[i][j][2] = max(dp[i][j][2], dp[i - 1][j][1] + 1);
if (dp[i][j - 1][1] != 0)dp[i][j][2] = max(dp[i][j][2], dp[i][j - 1][1] + 1);
}
}
}
cout << max(dp[n - 1][n - 1][0], max(dp[n - 1][n - 1][1], dp[n - 1][n - 1][2]));
return 0;
}
'알고리즘,SQL > 백준,BOJ' 카테고리의 다른 글
[ boj : 2533 ] 사회망 서비스(SNS) (0) | 2021.10.06 |
---|---|
[ boj : 1262 ] 알파벳 다이아몬드 (0) | 2021.10.02 |
[ boj : 17135 ] 캐슬 디펜스 (0) | 2021.09.20 |
[ boj : 1253 ] 좋다 (0) | 2021.09.19 |
[ boj : 1595 ] 북쪽나라의 도로 (0) | 2021.09.17 |