Algorithm/SWExpertAcademy
[SWEA][9092번] 마라톤
1일1코딩
2020. 3. 30. 23:08
https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AW7Opy-KWPoDFAWY
SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
풀이과정
1. 완전탐색으로 풀었다가 시간초과가 나서 Dp로 변경
2. 최대 K만큼의 구간을 건너 뛸 수 있으므로 dp[N][K]로 dp 사이즈 결정
3. dp[cur][K] = dp[next][K] + dis(cur, next) 와 같은 식을 구할 수 있다.
소스코드
더보기
#include <stdio.h>
#include <vector>
#include <string.h>
#include <algorithm>
#define MAX_VAL 0x7fffffff
using namespace std;
int dp[501][501];
vector<pair<int, int>> v;
int N, K;
int abs(int n) {
return n >= 0 ? n : n * -1;
}
int calcDis(int n1, int n2)
{
int tmp = abs(v[n1].first - v[n2].first) + abs(v[n1].second - v[n2].second);
return tmp;
}
int solution(int cur, int k)
{
if (cur == N - 1) return 0;
if (dp[cur][k] != -1) return dp[cur][k];
dp[cur][k] = MAX_VAL;
for (int i = 0; i <= K; i++) {
int next = cur + i + 1;
if (next > N - 1) continue;
if (k - i < 0) continue;
int dis = calcDis(cur, next);
dp[cur][k] = min(dp[cur][k], dis + solution(next, k - i));
}
return dp[cur][k];
}
int main()
{
int tc;
scanf(" %d", &tc);
for (int t = 1; t <= tc; t++) {
scanf(" %d %d", &N, &K);
v.clear();
memset(dp, -1, sizeof(dp));
for (int i = 0; i < N; i++) {
int x, y;
scanf(" %d %d", &x, &y);
v.push_back(make_pair(x, y));
}
printf("#%d %d\n", t, solution(0, K));
}
}