You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
#include<cstdio>
#include<vector>
#include<stack>
#include<algorithm>usingnamespacestd;//dp[n] : n을 루트로 하는 서브 트리에서 ([0] : n을 포함하지 않고, [1] : n을 포함하고) 서브 트리의 모든 팀을 참여시킬 때의 매출액의 최솟값int n, sales[300001], leader, member, dp[300001][2];
vector<vector<int>> tree(300001,vector<int>());
stack<pair<int, int>> funcStack;
intmain(){
scanf("%d",&n);
for(int cnt=0;cnt<n;++cnt)
scanf("%d",&sales[cnt]);
for(int cnt=1;cnt<n;++cnt){
scanf("%d%d",&leader,&member);
tree[leader].push_back(member);
}
//재귀함수 대신 funcStack 사용
funcStack.push(make_pair(0,0));
while(!funcStack.empty()){
int leader = funcStack.top().first, mode = funcStack.top().second;
funcStack.pop();
//mode가 0일 때는 재귀적으로 각 서브 트리로 진입함if(!mode){
funcStack.push(make_pair(leader,1));
for(int cnt=0;cnt<tree[leader].size();++cnt)
funcStack.push(make_pair(tree[leader][cnt],0));
}
//mode가 1일 때 팀원노드들은 모두 계산이 완료되어 있으므로 팀장노드를 계산함else{
//팀장 노드가 들어갈 때(dp[leader][1])는 항상 팀장의 팀이 들어가니까//팀원들이 들어가든 말든 상관없이 (팀원하위팀 매출액 최솟값의 합 + 팀장 매출액) 이 최솟값이 됨//팀장 노드가 들어가지 않을 때(dp[leader][0])는 팀원 1명 이상이 무조건 들어가 있어야 하니//sumMembers를 이용해서 예외상황을 처리함int sumMembers = 0;
for(int cnt=0; cnt<tree[leader].size(); ++cnt){
member = tree[leader][cnt];
dp[leader][0] += min(dp[member][0], dp[member][1]), sumMembers += dp[member][0];
}
dp[leader][1] = dp[leader][0]+sales[leader];
//dp[leader][0]은 현재 (팀원하위팀 매출액 최솟값의 합)이기 때문에 이게 sumMembers이랑 같다는 건//팀원이 한명도 들어가 있지 않다고 추측할 수 있음if(tree[leader].size() && dp[leader][0] == sumMembers){
//따라서 팀원을 한 명씩 넣어보면서 최솟값을 갱신함
dp[leader][0] = (1<<31)-1;
for(int cnt=0; cnt<tree[leader].size(); ++cnt){
member = tree[leader][cnt];
dp[leader][0] = min(dp[leader][0], sumMembers-dp[member][0]+dp[member][1]);
}
}
}
}
//CEO가 들어간 최솟값과 제외한 최솟값 중 더 작은 값을 출력함printf("%d", min(dp[0][0], dp[0][1]));
return0;
}
정산
손현수x3
황지원x2
전현준
심규진
송용우
모범 답안 작성 후 해설 작성시 모범 답안 채택 갯수 시상에 우대합니다(동점자 발생시). 모범 답안 선정되신 분들은 다른 학우분들이 코드를 보고 공부하실 수 있도록 해설 남겨주시면 감사드리겠습니다.
코드에 주석으로 달아주신 분들은 해설을 작성해주신것으로 간주하겠습니다. 물론 추가 해설을 작성해주시면 너무 감사드립니다.
해설은 본 이슈에 계속 달아주세요!
모범 답안 및 해설에 대한 질문이 있으신 분들도 여기에 같이 남겨주시면 좋을 것 같습니다. 슬랙 #dcomding 채널을 이용해주셔도 좋습니다.
The text was updated successfully, but these errors were encountered:
개요
모범 답안
1. 젠가
문제 보기
정답 : 10명
황지원
stack을 이용한 풀이
2. 키로거
문제 보기
정답 : 7명
황지원
doubly linked list를 이용한 풀이
전현준
stack을 이용한 풀이
3. 쿠키 구입
문제 보기
정답 : 6명
심규진
투 포인터를 이용한 풀이
손현수
binary search를 이용한 풀이
4. 단어 퍼즐
문제 보기
정답 : 4명
송용우
dp를 이용한 풀이
손현수
trie + dp를 이용한 풀이
5. 디닷컴 주식회사
문제 보기
정답 : 2명
손현수
dp를 이용한 풀이
정산
모범 답안 작성 후 해설 작성시
모범 답안 채택 갯수 시상
에 우대합니다(동점자 발생시). 모범 답안 선정되신 분들은 다른 학우분들이 코드를 보고 공부하실 수 있도록 해설 남겨주시면 감사드리겠습니다.코드에 주석으로 달아주신 분들은 해설을 작성해주신것으로 간주하겠습니다. 물론 추가 해설을 작성해주시면 너무 감사드립니다.
해설은 본 이슈에 계속 달아주세요!
모범 답안 및 해설에 대한 질문이 있으신 분들도 여기에 같이 남겨주시면 좋을 것 같습니다. 슬랙 #dcomding 채널을 이용해주셔도 좋습니다.
The text was updated successfully, but these errors were encountered: