Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 백준 #1010 #다리놓기
- 코딩테스트실력진단
- Today I Learned
- IT 좀 아는 사람
- 공부 기록
- 행복한 수열의 개수
- 회의실 배정
- spring
- 공부하기 싫어 #그래도 해야해
- 코드트리 챌린지
- 코딩테스트
- til
- 백준
- JPA
- @EntityGraph
- TagLibraryValidator
- eager
- 동적 계획법
- 구름톤 트레이닝
- 즉시로딩
- 금 채굴하기
- 1005 #ACM craft #백준
- 최장 공통 부분수열
- 지연로딩
- 멀록 조명등
- 1931번
- 코드트리
- 구름톤
- 구름톤 챌린지
- 완전탐색
Archives
- Today
- Total
화분
[1005]ACM craft 본문
처음에는 다익스트라 알고리즘의 변형으로 문제를 풀려고 하였다. 알고리즘을 짜는데 상당히 오랜 시간이 걸렸지만(stl 등의 c++ 사용법을 익히는 등의 이유로) 정답은 얼추 잘 맞추는거 같았다. 하지만 메모리 초과 문제가 발생하였다.
초안:
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
int main() {
short times = 0;
cin >> times;
for (int t = 0; t < times; t++)
{
vector<short> relations[1001];
int result_cost[1001];
int costs[1001];
priority_queue<pair<short, int>, vector<pair<short, int>>, less<pair<short, int>>> pq;
int nob = 0, nor = 0;
cin >> nob >> nor;
for (int i = 1; i <= nob; i++)
{
cin >> costs[i];
result_cost[i] = costs[i];
}
for (int i = 0; i < nor; i++)
{
int n = 0, m = 0;
cin >> n >> m;
relations[n].push_back(m);
}
short end_point = 0;
cin >> end_point;
pair<int, short> p = make_pair(costs[1], 1);
pq.push(p);
while (!pq.empty())
{
pair<int, short> current_point = pq.top();
pq.pop();
for (auto& ele : relations[current_point.second])
{
if (result_cost[current_point.second] + costs[ele] > result_cost[ele])
{
result_cost[ele] = result_cost[current_point.second] + costs[ele];
}
pq.push(make_pair(result_cost[ele], ele));
}
}
if (costs[end_point] > result_cost[end_point])
result_cost[end_point] = costs[end_point];
cout << result_cost[end_point];
}
}
이번엔 동적 프로그래밍을 활용하여 풀기로 하였다. 처음부터 코드를 스스로 짠 건 아니고 다른 사람이 풀은 걸 보고 떠올려서 작성해보았다. 이 코드가 보여주는 동적 프로그래밍의 특징은 테이블을 만들어서 거기에 기록한다는 점이다. 테이블에 기록된 작은 문제의 값을 이용하여 보다 큰 sub problem도 해결해나갈수 있다는 점도 그렇다.
#include <bits/stdc++.h>
using namespace std;
int times = 0;
int b,k,n,m,e,dp[1001];
int arr[1001];
bool path[1001][1001];
int func(const int& a){
if(dp[a] != -1) return dp[a];
int mt = 0;
for(int i = 1; i <= b; i++)
{
if(path[i][a] != true) continue;
mt = max(mt, func(i));
}
dp[a] = mt + arr[a];
return dp[a];
}
int main(){
cin >> times;
while(times--)
{
memset(dp, -1, sizeof(dp));
memset(arr, 0, sizeof(arr));
memset(path, false, sizeof(path));
cin>> b >> k;
for(int i = 1; i <= b; i++)
cin>>arr[i];
for(int i = 0; i < k; i++)
{cin>> n >> m;
path[n][m] = true;
}
cin >> e;
cout << func(e) << endl;
}
}
'Study > CODINGTEST' 카테고리의 다른 글
[구름톤 챌린지 5일차] 이진수 정렬 (0) | 2023.08.19 |
---|---|
[9251]LCS (0) | 2022.02.16 |
[12865]평범한 배낭 (0) | 2022.02.15 |
[1010]다리 놓기 (0) | 2022.02.12 |
[1904]01타일 풀이 (0) | 2022.01.10 |