Henu
개발냥발
Henu
전체 방문자
오늘
어제
  • 분류 전체보기 (411)
    • DevOps (52)
      • Kubernetes (19)
      • Docker (14)
      • AWS (3)
      • Nginx (4)
      • Linux (4)
      • ArgoCD (1)
      • CN (2)
      • NATS (0)
      • Git (5)
    • Back-End (30)
      • Django (18)
      • Spring (5)
      • JPA (1)
      • MSA (5)
    • CS (87)
      • SystemSoftware (20)
      • OS (25)
      • Computer Architecture (16)
      • Network (23)
      • Database (2)
    • Lang (21)
      • Java (9)
      • Python (4)
      • C# (8)
    • Life (12)
    • 블록체인 (2)
    • Algorithm (204)
      • BOJ (160)
      • 프로그래머스 (19)
      • LeetCode (4)
      • SWEA (1)
      • 알고리즘 문제 해결 전략 (8)
      • DS, algorithms (7)
      • Checkio (5)
    • IT (2)

블로그 메뉴

  • GitHub
  • 글쓰기
  • 관리자

공지사항

  • Free!

인기 글

태그

  • DFS
  • 프로그래머스
  • Kubernetes
  • docker
  • 백트래킹
  • Network
  • 다이나믹 프로그래밍
  • boj
  • django
  • BFS

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Henu

개발냥발

Algorithm/BOJ

[백준 2533] 사회망 서비스(SNS) C++

2021. 5. 6. 01:22
 

2533번: 사회망 서비스(SNS)

페이스북, 트위터, 카카오톡과 같은 사회망 서비스(SNS)가 널리 사용됨에 따라, 사회망을 통하여 사람들이 어떻게 새로운 아이디어를 받아들이게 되는가를 이해하는 문제가 중요해졌다. 사회망

www.acmicpc.net

트리에서의 다이나믹 프로그래밍 입문 #3

 

 

[백준 1949] 우수 마을 C++

1949번: 우수 마을 첫째 줄에 정수 N이 주어진다. (1≤N≤10,000) 둘째 줄에는 마을 주민 수를 나타내는 N개의 자연수가 빈칸을 사이에 두고 주어진다. 1번 마을부터 N번 마을까지 순서대로 주어지며,

hyeo-noo.tistory.com

지난 포스팅 우수마을과 다르게

dp[now][0] -> 현재 친구가 얼리어답터가 아니라면 연결된 모든 친구는 얼리어답터여야 한다

이므로 dp[now][0] += dp[next][1]; 와 같이 쓸 수 있다

 

그리고 얼리어답터인 친구끼리 붙을 수 있기 때문에 아래와 같은 식을 통해 연결된 친구가 얼리어답터인지 아닌지 라는 2개의 경우에 따라 최솟값을 갱신한다

dp[now][1] += min(dp[next][0], dp[next][1]);

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
#include <iostream>
#include <vector>
 
using namespace std;
 
int N;
vector<int> tree[1000001];
 
// now가 루트일 때의 서브트리에서 얼리아답터의 최소 수
int dp[1000001][2];
bool visited[1000001];
 
void input(){
    int u, v;
    cin >> N;
    for(int i = 0; i < N-1; i++){
        cin >> u >> v;
        tree[u].push_back(v);
        tree[v].push_back(u);
    }
}
 
void dfs(int now){
    visited[now] = true;
    
    dp[now][0] = 0;
    dp[now][1] = 1;
    
    for(int i = 0; i < tree[now].size(); i++){
        int next = tree[now][i];
        if(visited[next]) continue;
        dfs(next);
        
        dp[now][0] += dp[next][1];
        dp[now][1] += min(dp[next][0], dp[next][1]);
    }
}
 
int main(){
    ios_base::sync_with_stdio(0); cin.tie(0);
    input();
    dfs(1);
    cout << min(dp[1][0], dp[1][1]);
    return 0;
}
Colored by Color Scripter
cs

dfs, 양방향 트리, 2차원 DP배열

 

미래의 나는 트리에서의 다이나믹 프로그래밍을 잊을 것이다

이걸 보고 다시 떠올려 주면 좋겠다

'Algorithm > BOJ' 카테고리의 다른 글

[백준 10026] 적록색약 C++  (0) 2021.05.08
[백준 14499] 주사위 굴리기 C++  (0) 2021.05.08
[백준 1949] 우수 마을 C++  (2) 2021.05.06
[백준 15681] 트리와 쿼리 C++  (0) 2021.05.05
[백준 2602] 돌다리 건너기 C++  (1) 2021.05.05
    'Algorithm/BOJ' 카테고리의 다른 글
    • [백준 10026] 적록색약 C++
    • [백준 14499] 주사위 굴리기 C++
    • [백준 1949] 우수 마을 C++
    • [백준 15681] 트리와 쿼리 C++

    티스토리툴바