[๋ฐฑ์ค(BOJ)] ์ด์ง ํธ๋ฆฌ(13325) C++
๋ฌธ์ : BOJ_13325๋ฒ ์ด์ง ํธ๋ฆฌ
๋ฌธ์ ์ค๋ช
ํธ๋ฆฌ ์ํ
ํฌํ์ด์ง ํธ๋ฆฌ๋ฅผ ๋ค๋ฃจ๋ ๋ฌธ์ ์
๋๋ค.
ํธ๋ฆฌ์ ๋์ด k๊ฐ ์ฃผ์ด์ง๊ณ , ๋ณดํต์ ํธ๋ฆฌ ๋ฌธ์ ์๋ ๋ค๋ฅด๊ฒ ๋
ธ๋์ ๊ฐ์ด ์๋ ๊ฐ์ ์ ๊ฐ์ด ์ฃผ์ด์ง๋๋ค.
๋ฃจํธ ๋
ธ๋์์ ๋ฆฌํ ๋
ธ๋๋ก ๊ฐ๋ ๊ฑฐ๋ฆฌ ์ค ์ต๋๊ฐ์ x๋ผ๊ณ ํ๋ค๋ฉด, ๊ฐ๊ฐ์ ๊ฐ์ ์ ์ต์๊ฐ์ ๋ํ์ฌ ๋ฃจํธ ๋
ธ๋์์ ๋ฆฌํ ๋
ธ๋๊น์ง์ ๊ฐ๊ฐ์ ๋ชจ๋ ๊ฑฐ๋ฆฌ๋ฅผ x๋ฅผ ๋ง์ถฐ์ค์ผ ํ๋ ๋ฌธ์ ์
๋๋ค.
Solution
๊ฑฐ๋ฆฌ๋ฅผ ๋ง์ถ ๋ ์์ ๋
ธ๋์ ๊ฐ์ ์์ ๊ฐ์ ์ต๋๊ฐ์ผ๋ก ๋ํด์ค์๋ก ์ต์ข
๊ฑฐ๋ฆฌ๋ค์ ๊ฐ์ด ์ค์ด๋ญ๋๋ค.
์ฌ๊ท์ ๋ฐฉ์์ ์ด์ฉํ์ต๋๋ค.
์ฐ์ dfs๋ฅผ ์ํํ์ฌ ๊ฐ์ฅ ๋จผ ๋ฆฌํ ๋
ธ๋์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํฉ๋๋ค
๊ทธ๋ฆฌ๊ณ ๋ค์ ๋ฆฌํ ๋
ธ๋๋ฅผ ์ํํฉ๋๋ค.
์ด๋, ๋ฆฌํ ๋
ธ๋๊น์ง์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐ๊ฒ ๋ง์ถ๊ธฐ ์ํด ๊ฐ์ ์ ๋ ํด์ผ ํ๋ ๊ฐ์ ๊ฐ๊ฐ ๋ถ๋ชจ ๋
ธ๋์ ๊ฐ์ ์ผ๋ก ๋ค์ ๋ณด๋ด์ค๋๋ค.
์ด์ง ํธ๋ฆฌ์ด๊ธฐ ๋๋ฌธ์ ์ค๋ฅธ์ชฝ๊ณผ ์ผ์ชฝ ๊ฐ์ธ ๋ ๊ฐ๋ง ๋ค์ด์ค๊ฒ ๋ฉ๋๋ค.
์ค๋ฅธ์ชฝ๊ณผ ์ผ์ชฝ์ ์ต์๊ฐ์ ๋ถ๋ชจ ๋
ธ๋์ ๊ฐ์ ์ ๋ํด์ฃผ์ด์ผ ๋ง์ง๋ง์ ๊ฐ์ ์ ๋ํด์ผ ํ๋ ๊ฐ์ ์ต์๊ฐ์ด ๊ตฌํด์ง๋ฏ๋ก, ์ผ์ชฝ ์ค๋ฅธ์ชฝ ๊ฐ์ ์ด ํ์ํ ๊ฐ ์ค ์ต์๊ฐ์ ๋ถ๋ชจ ๋
ธ๋์ ๊ฐ์ ์ ๊ฐฑ์ ํด ์ฃผ๊ณ , ๊ทธ ๊ฐ์ ์ ๋ค์ ์์ ์ ๋ถ๋ชจ ๋
ธ๋์ ๊ฐ์ ์ ๊ฐฑ์ ํด ์ฃผ๋ ๋ฐฉ์์ผ๋ก ํด๊ฒฐํ์์ต๋๋ค.
Description
- ๋ ธ๋ ์์ฃผ๊ฐ ์๋ ๊ฐ์ ์์ฃผ๋ก ํด๊ฒฐํ์ต๋๋ค.
- ์์ ์ ์์ ๋
ธ๋์ ๊ฐ์ ๋ฒํธ๋
์์ ์ ๊ฐ์ ๋ฒํธ *2 +1, ์์ ์ ๊ฐ์ ๋ฒํธ *2 +2
๋ก ๊ตฌํ ์ ์์ต๋๋ค.
#include <iostream>
#include <cmath>
#include <vector>
#include <algorithm>
using namespace std;
int k, edgeCnt, edgeSum;
vector<int> edge;
vector<int> minValue;
void dfs(int idx,int sum){
if(idx*2+1<=edgeCnt) dfs(idx*2+1,sum+edge[idx*2+1]);
if(idx*2+2<=edgeCnt) dfs(idx*2+2,sum+edge[idx*2+2]);
edgeSum=max(edgeSum,sum);
}
int recursion(int idx,int sum){
if(idx*2+1>edgeCnt || idx*2+2>edgeCnt) {
return minValue[idx] = edgeSum-sum;
}
minValue[idx]=min(recursion(idx*2+1,(sum+edge[idx*2+1])),recursion(idx*2+2,(sum+edge[idx*2+2])));
return minValue[idx];
}
void minFunc(int idx, int value){
minValue[idx]-=value;
edge[idx]+=minValue[idx];
if(idx*2+1>edgeCnt || idx*2+2>edgeCnt) return;
minFunc(idx*2+1,value+minValue[idx]);
minFunc(idx*2+2,value+minValue[idx]);
}
int main(){
cin >> k;
for(int i =1; i<=k;i++){
edgeCnt+=pow(2,i);
}
minValue.resize(edgeCnt+1);
edge.resize(edgeCnt+1);
for(int i=1;i<=edgeCnt;i++){
cin >> edge[i];
}
dfs(1,edge[1]);
dfs(2,edge[2]);
recursion(1,edge[1]);
recursion(2,edge[2]);
minFunc(1,0);
minFunc(2,0);
int result=0;
for(int i=1;i<=edgeCnt;i++) {
result+=edge[i];
}
cout << result << '\n';
return 0;
}
'Algorithm > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ] LCS(9251) (0) | 2022.03.12 |
---|---|
[BOJ] ๊ณ๋จ ์ค๋ฅด๊ธฐ(2579) (0) | 2022.03.12 |
[BOJ] ํด์ฌ(14501) (0) | 2022.03.12 |
[BOJ] ํ๋ฒํ ๋ฐฐ๋ญ(12865) (0) | 2022.03.12 |
[BOJ] ์ธํ์ ์ํ(2098) (0) | 2022.03.11 |