본문 바로가기
Algorithm/Programmers

튜브의 소개팅 - level 4

by y.j 2019. 4. 14.
728x90

해결방법

고려해야 변수는 y, x, d(거리)이다. 따라서 3차원 배열로 dp를 정의했다.

ll dp[51][51][2510];

점화식은 아래와 같이 된다. newy, newx는 다음번에 이동할 좌표를 의미한다. 다음 좌표는 해당 좌표의 +1이므로 d+1번째에 저장한다. 이전까지의 s + time_map[y][x]를 저장하면 된다.
$$ dp[newy][newx][d+1] = min(dp[newy][newx][d+1], dp[y][x][d] + time_map[y][x]) $$

당연히 수다시간은 제한이 있으므로 제한 시간 넘으면 못가게 해야 한다.

if(dp[y][x][d] + time_map[y][x] <= s)
    dp[newy][newx][d+1] = min(dp[newy][newx][d+1],dp[y][x][d] + time_map[y][x]);

전체코드

#include <vector>
using namespace std;
typedef long long ll;
int dx[] = {1,-1,0,0};
int dy[] = {0,0,1,-1};
ll dp[51][51][2510];
const ll inf = (ll)1 << 31;
vector<int> solution(int m, int n, int s, vector<vector<int>> time_map) {
    vector<int> answer;
    for(int y = 0; y <= 50; ++y)
        for(int x = 0; x <= 50; ++x)
            for(int i = 0; i < 2510; ++i)
                dp[y][x][i] = inf;
    dp[0][0][0] = 0;
    for(int d = 0; d < 2500; ++d)
        for(int y = 0; y < m; ++y)
            for(int x = 0; x < n; ++x) {
                if(time_map[y][x] == -1) continue;
                for(int i = 0; i < 4; ++i) {
                    int newy = y + dy[i];
                    int newx = x + dx[i];
                    if(newy < 0 || newx < 0 || newy >= m || newx >= n) continue;
                    if(dp[y][x][d] + time_map[y][x] <= s)
                        dp[newy][newx][d+1] = min(dp[newy][newx][d+1],dp[y][x][d] + time_map[y][x]);
                }
            }
    for(int i = 0; i < 2500; ++i)
        if(dp[m-1][n-1][i] != inf) {
            answer = {i, (int)dp[m-1][n-1][i]};
            break;
        }
    return answer;
}
728x90

'Algorithm > Programmers' 카테고리의 다른 글

단속카메라 - level 3  (0) 2019.05.06
줄 서는 방법 - level 3  (0) 2019.05.04
서울에서 경산까지 - level 4  (0) 2019.04.14
GPS - level 4  (0) 2019.04.13
단체사진 찍기 - Level 4  (0) 2019.04.06

댓글