현재까지 왼쪽에서 $l$개를 먹었고 오른쪽에서 $r$개를 먹었다고 하여 약 봉투의 상태를 $(l,r)$로 나타낼 수 있습니다. 따라서 BFS로 $(0,0)$에서 출발해 어디까지 갈 수 있는지 보면 되죠.
#include<cstdio>
#include<queue>
#include<utility>
using namespace std;
typedef pair<int, int> Pint;
int n;
char pill[1501];
queue<Pint> q;
bool visited[1500][1500];
int max_pill(void) {
int time = 0; // 0: breakfast, 1: lunch, 2: dinner
char s[] = "BLD";
q.push(Pint(0, 0));
visited[0][0] = true;
int lv = -1, l, r;
while (!q.empty()) {
int sz = q.size();
while (sz--) {
l = q.front().first;
r = q.front().second;
q.pop();
if (l + r < 3*n) {
if (pill[l] == s[time] && !visited[l+1][r]) {
q.push(Pint(l+1, r));
visited[l+1][r] = true;
}
if (pill[3*n-1-r] == s[time] && !visited[l][r+1]) {
q.push(Pint(l, r+1));
visited[l][r+1] = true;
}
}
}
lv++;
time = (time+1) % 3;
}
return lv;
}
int main(void) {
scanf("%d %s", &n, pill);
printf("%d", max_pill());
return 0;
}