ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [ c++ ][ Python ] 퇴사
    Algorithm/백준 2020. 4. 30. 17:31

     

    처음에 문제를 읽고나서 가장 먼저 든 생각은 DFS면 풀리겠다 였다.

    생각대로 i번째 날짜에서 상담을 하는 경우와 하지 않는 경우로 나누면 답을 빨리 구할 수 있었다.

    이 경우 N이 최대 15이기 때문에 재귀로 문제를 풀어도 문제가 발생하지 않는다. 

     

      DFS code

    • C++
    #include <iostream>
    #define MAXSZ 17
    
    using namespace std;
    
    int N, res = -1;
    int day[MAXSZ];
    int price[MAXSZ];
    
    void solve(int cur, int sum) {
    	if (cur == N) {
    		if (res < sum)
    			res = sum;
    		return;
    	}
    	else if (cur > N)
    		return;
    
    	solve(cur + 1, sum);
    	solve(cur + day[cur], sum + price[cur]);
    }
    
    int main() {
    	ios_base::sync_with_stdio(false);
    	
    	cin >> N;
    	for (int i = 0; i < N; i++) {
    		cin >> day[i] >> price[i];
    	}
    
    	solve(0, 0);
    
    	cout << res;
    	return 0;
    }
    • python
    import sys
    
    N = int(input())
    day = [0]*20
    price = [0]*20
    res = -1
    
    for i in range(0, N):
        day[i], price[i] = map(int, sys.stdin.readline().strip().split(" "))
        #day[i], price[i] = map(int,input().split())
    
    def solve(cur, sum):
        global res
        if (cur == N) :
            res = max(res, sum)
            return
        elif (cur > N) :
            return
    
        solve(cur + day[cur], sum + price[cur])
        solve(cur+1, sum)
    
    solve(0,0)
    print(res)

     

     

      DP code

     

    이 문제를 DP로 풀기 위해서 생각하는 과정에서 많은 문제가 있었다.

    처음에 DP[i] = i일에서의 최대 금액 을 맞추기 위해 O(N^2)의 방법을 생각했다. 하지만 과정을 잘 생각해보니 for문 한 번으로 DP에 모두 기록할 수 있었다.

    • C++
    #include <iostream>
    #include <algorithm>
    #define MAXSZ 20
    
    using namespace std;
    
    int day[MAXSZ];
    int price[MAXSZ];
    int dp[MAXSZ];
    
    int main() {
    	ios_base::sync_with_stdio(false);
    
    	int N, res = 0;
    
    	cin >> N;
    	for (int i = 1; i <= N; i++) {
    		cin >> day[i] >> price[i];
    	}
    
    	for (int i = 1; i <= N + 1; i++) {
    		dp[i] = max(dp[i], res);
    		dp[day[i] + i] = max(dp[day[i] + i], price[i] + dp[i]);
    		res = dp[i];
    	}
        
    	cout << res;
    	return 0;
    }

    i 번째 날에 최대 금액은 현재 최대값, dp[i] 중에 하나이다.

    ( i번째 날 + 상담기간 ) 인 날에 최대 금액은 ( 해당 날짜의 최대값 ), ( i번째 날의 최대값 + i번째날의 금액 ) 중 하나이므로 이를 dp에 갱신해준다.

     

    • python

     

     

     

     

     

     

    'Algorithm > 백준' 카테고리의 다른 글

    [ C++ ] 1918 - 후위표기식  (0) 2020.07.01
    [ C++ ] 2718 - 타일 채우기  (0) 2020.06.10
    [ Python ] 오르막수  (0) 2020.04.28

    댓글

Designed by Tistory.