일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Cycle detecting
- Euler circuit
- disjoint-set
- Algospot
- Eulerian path
- hashing
- bitmask
- 백준
- scc
- CS Academy
- BOJ
- Sieve_of_Eratosthenes
- DynamicProgramming
- graph
- POJ
- mathematics
- Shortest path
- graph modeling
- Greedy
- Dag
- flows
- Eulerian circuit
- Euler path
- BST
- backtracking
- BFSDFS
- dynamic programming
- implementation
- GCD
- Segment Tree
- Today
- Total
그냥 하는 노트와 메모장
BOJ 15807 *빛*영*우* 본문
* BOJ 15807 *빛*영*우*
[분류 : 다이나믹 프로그래밍]
[풀이]
좌표 (X, Y)에 대한 2차원 다이나믹을 생각해보자.
dp[x][y] = (x, y) 좌표에 대한 빛의 세기
1. 영향력
당연히 y좌표가 낮은 곳에 설치된 조명들은 상대적으로 y좌표가 높은 곳에 있는 부분에 영향을 미칠 수 있다.
2. 기울기
조명에 대해 존재할 수 있는 기울기는 두 개밖에 없다. y=x와 y=-x.
3.
[조명] 현재 좌표에 조명이 설치 되어 있다면 그 조명 수만큼 추가해준다.
[같은 직선 위] 현재 좌표 (x, y)에 해당하는 dp[x][y]를 구하기 위해서는 (x, y)를 포함하고 기울기가 1이거나 -1인 것을 생각해보자. y값이 현재보다 작은 모든 조명에 대해 같은 기울기를 가지며 같은 직선 상에 있는 것을 가져오는 것이다. 기울기가 1인 것과 -1인 것에 대해서 값을 가져올텐데 여기서 두 기울기는 독립적이므로 각각 가져와도 상관없다. 같은 직선 위에 있다는 걸 판단하는건 x절편 또는 y절편을 이용하면 편하다.
[나머지] 조명이 같은 직선 상에 있지 않은 경우를 셈해야한다. 그 값은 간단하게도 바로 아래에 있는 값을 가져오면 된다. 즉, dp[x, y-1]를 가져오는 것인데 이 의미는 곧 dp[x, y-1]에서의 빛의 세기이며 이 값은 이전에 (x, y)를 포함하는 직선보다 아래에 있는 직선들(조명들)만 가져오기에 나머지 값을 모두 포함시킬 수 있다.
dp[x][y] = dp[x][y - 1] + diagonal1[x+y] + diagonal2[-x+y] + light[x][y]
4. 마지막으로 현재 좌표에 조명이 있다면 대각선 데이터에 값을 추가해준다. 필자의 경우 y절편을 가져오도록 구현했다.
diagonal1[x+y] += light[x][y]
diagonal2[-x+y] += light[x][y]
※ 주의! 같은 좌표에 조명이 여러개 설치될 수 있음.
'Solved problems' 카테고리의 다른 글
BOJ 3032 승리 (0) | 2020.05.21 |
---|---|
BOJ 12103 짝합 수열, 7976 수열 (0) | 2020.05.21 |
BOJ 3948 홍준이의 친위대 (0) | 2020.05.20 |
BOJ 2112 두 부분 문자열, BOJ 3244 두 부분 문자열2 (0) | 2020.05.20 |
BOJ 5580 빙고 게임 (0) | 2020.05.20 |