Hoon222y

[BOJ 1495] 기타리스트 본문

코딩/BOJ & 알고스팟

[BOJ 1495] 기타리스트

hoon222y 2017. 10. 7. 15:11

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


DP문제이다. DP[i][j] 정의를 " i번째까지 사용하였을 때 j값을 만들수 있는가 없는가?" 로 정의하였다. 문제의 조건에 따라서 state값의 범위를 0이상 , m이하로 정의를 하고 pos가 n+1 까지 갔을때 state을 가지고 최대값을 가져왔다. 이번에도 재귀로 구현하였다. 근데 재귀 부분에서 ret = max(...)  이 부분 뭔가 깔끔하지가 않은데 이거 어케 해야될지 모르겠당 


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
46
47
48
49
50
51
52
53
54
55
#include <iostream>
#include <cstdio>
#include <vector>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <set>
#include <queue>
#include <stack>
#define MAX_N 50
#define INF 1e8
 
typedef long long ll;
 
using namespace std;
 
int n,m,s,arr[111],ans,dp[111][1111];
 
 
int solve(int pos , int state){
    if(state>|| state<0)              //소리 범위가 0미만 , m 초과일떄
        return -INF;
    if(pos == (n+1)){                   //val값 (arr 시작이 1부터라 n+1)
        return state;
    }
    int &ret = dp[pos][state];
    
    if(ret != -1)
        return ret;
    
    ret = -INF;
    ret = max(ret , solve(pos+1, state-arr[pos]));
    ret = max(ret , solve(pos+1 , state+arr[pos]));
    return ret;
}
 
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    ans = 0;
    memset(dp,-1,sizeof(dp));
    cin >> n >> s >> m;
    
    for(int i=1;i<=n;i++){
        cin >>arr[i];
    }
    int ans = solve(1,s);
    if(ans < 0){
        cout << "-1\n";
    }else{
        cout << ans <<endl;
    }
    
    return 0;
}
cs



'코딩 > BOJ & 알고스팟' 카테고리의 다른 글

[BOJ 1328] 고층 빌딩  (0) 2017.10.09
[BOJ 1011] Fly me to the Alpha Centauri  (0) 2017.10.07
[BOJ 5557] 1학년  (0) 2017.10.07
[BOJ 1126] 같은 탑  (0) 2017.10.07
[BOJ 14501] 퇴사  (0) 2017.10.06
Comments