백준문제풀이

백준 문제 14501번 퇴사 문제풀이 c++

노가다 김씨 2022. 4. 11. 03:51

https://www.acmicpc.net/problem/14501

 

14501번: 퇴사

첫째 줄에 백준이가 얻을 수 있는 최대 이익을 출력한다.

www.acmicpc.net

 

문제해석

 

문제를 보면 dp 문제임을 어렵지 않게 알 수있는데

나는 탑다운 형식으로 dp를 작성하였다.

예시와 같은 문제일때 1일 부터 확인하는게 아닌 7일부터 확인해야한다.

 

1일을 확인해보자

1일 상담을 하면 2일 3일은 상담을 할 수 없다.

즉 1일 상담의 금액 P[0]과

4일부터 상담했을때 최대 이익 =dp[3]

5일부터 상담했을때 최대 이익 =dp[4]

6일부터 상담했을때 최대 이익 =dp[5]

7일부터 상담했을때 최대 이익 =dp[6]

의 합중 가장 큰것이 답이 된다.

즉 dp[0]=max(p[0]+dp[4],p[0]+dp[5],p[0]+dp[6],p[0]+dp[7])

 

이것을 일반화 하여 작성하면 아래 코드와 같다.

 

코드

 

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int T[15];
int P[15];
int dp[15];
int main(){
    cout.tie(NULL);
    cin.tie(NULL);
    ios_base::sync_with_stdio(false);
    int n; cin>>n;
    int ans=0;
    for(int i=0; i<n; i++)
    {
        cin>>T[i]>>P[i];
    }
    for(int i=n-1; i>=0; i--)
    {
        for(int j=i+T[i]; j<=n; j++)
        {
            dp[i]=max(dp[i],P[i]+dp[j]);
        }
        ans=max(ans,dp[i]);
    }
    cout<<ans;
}