반응형
https://www.acmicpc.net/problem/2157
2157번: 여행
첫째 줄에 N(1 ≤ N ≤ 300), M(2 ≤ M ≤ N), K(1 ≤ K ≤ 100,000)가 주어진다. K는 개설된 항공로의 개수이다. 다음 K개의 줄에는 각 항공로에 대한 정보를 나타내는 세 정수 a, b, c(1 ≤ a, b ≤ N, 1 ≤ c ≤ 1
www.acmicpc.net
[ 문제풀이 ]
1. dp [ i ][ j ]에서 i는 도시 번호, j는 1번 도시부터 몇 번 이동했는지를 표시합니다.
2. list[ i ][ j ]는 i도시에서 j도시까지 이동할 때 기내식의 가치입니다.
3. 3중 for문을 이용하여 dp[ i ][ j ]를 채워줍니다.
4. 점화식은 다음과 같습니다.
dp[ 다음 도시 ][ i + 1 ] = max( dp [ 다음 도시 ][ i + 1 ] , dp [ 현재 도시 ][ i ] + list [ 현재 도시 ][ 다음 도시 ])
[ 소스코드 ]
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | #include<iostream> using namespace std; int N, M, K; int list[301][301]; //i에서 j까지 기내식 비용 int dp[301][301]; //1번 도시에서 i번 도시까지 j번 이동했을 때의 최댓값 int main() { scanf("%d %d %d", &N, &M, &K); for (int i = 0; i < K; i++) { int a, b, cost; scanf("%d %d %d", &a, &b, &cost); if (a < b) { list[a][b] = max(list[a][b], cost); } } for (int i = 2; i <= N; i++) { //1번 도시에서 다른 도시로 가는 경우 if (list[1][i] != 0) { dp[i][2] = max(dp[i][2], list[1][i]); } } for (int i = 2; i < M; i++) { //2번 이동한 이후부터 계산 for (int j = 1; j <= N; j++) { if (dp[j][i] != 0) { for (int k = j+1; k <= N; k++) { if (list[j][k] != 0) { dp[k][i + 1] = max(dp[k][i + 1], dp[j][i] + list[j][k]); } } } } } int ans = 0; for (int i = 0; i <= M; i++) { ans = max(ans, dp[N][i]); } printf("%d", ans); } | cs |
반응형
'백준' 카테고리의 다른 글
[ 백준 ] 1577번 - 도로의 개수 (C++) (0) | 2022.11.04 |
---|---|
[ 백준 ] 2229번 - 조 짜기 (C++) (0) | 2022.11.03 |
[ 백준 ] 2666번 - 벽장문의 이동 (C++) (0) | 2022.11.01 |
[ 백준 ] 2302번 - 극장 좌석 (C++) (0) | 2022.10.31 |
[ 백준 ] 1309번 - 동물원 (C++) (0) | 2022.10.30 |