dp[i][0]을 1번부터 i번 사람까지 방향을 정했고 i번 사람이 왼쪽을 볼 때 탐색 가능한 구간 길이의 최댓값이라 하자. dp[i][1]은 i번 사람이 오른쪽을 볼 때의 최댓값이다.
편의를 위해
A0=B0=0,AN+1=L,BN+1=0
으로 둔다. 초깃값은 dp[0][0]=dp[0][1]=0이다.
i번 사람이 왼쪽을 보는 경우를 생각하자. i−1번 사람도 왼쪽을 본다면 두 사람이 서로를 향해 탐색하지 않으므로 새로 더해지는 길이는 min(Ai−Ai−1,Bi)이다.
i−1번 사람이 오른쪽을 본다면 i−1번 사람이 두 사람 사이의 구간을 먼저 최대 Bi−1만큼 덮고 있다. 따라서 아직 덮이지 않은 길이는 max(0,Ai−Ai−1−Bi−1)이고, i번 사람이 새로 덮을 수 있는 길이는
min(Bi,max(0,Ai−Ai−1−Bi−1))
이다.
따라서
dp[i][0]=max(dp[i−1][0]+min(Ai−Ai−1,Bi),dp[i−1][1]+min(Bi,max(0,Ai−Ai−1−Bi−1)))
이다.
i번 사람이 오른쪽을 본다면 새로 탐색하는 구간은 이전 사람들의 탐색 구간과 양의 길이로 겹치지 않는다. 따라서
dp[i][1]=max(dp[i−1][0],dp[i−1][1])+min(Ai+1−Ai,Bi)
이다.
정답은 max(dp[N][0],dp[N][1])이다. 각 i마다 상수 번의 연산만 수행하므로 시간 복잡도는 O(N)이다.
Solution written by GPT5.6