알고리즘/Codeforces

R485(Div.2) C. Three displays

세진짱 2018. 5. 30. 11:19


3개의 증가수열을 고르고 그 때의 비용이 최소를 찾는 문제다

N^2 DP로 풀었다


d[pos][cnt]로 테이블을 잡고 pos까지 봤고 cnt개 더 고를 수있을 때로 문제를 풀었다


문제 풀고 틀려서 보니 메모이제이션을 안했다 ㅎㅎ

소스 잘 봐야겠따..!


소스코드

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
#include <iostream>
#include <algorithm>
#include <string>
#include <set>
#include <vector>
#include <stack>
#include <cstring>
#include <queue>
#include <map>
#include <cmath>
#define ll long long
#define inf 1e17
using namespace std;
ll arr[3030], cost[3030];
int n;
ll d[3030][5];
 
ll go(ll pos, ll cnt) {
    if (cnt <= 0 || pos > n) return 0;
    if (cnt == 1return cost[pos];
 
    ll&ret = d[pos][cnt];
    if (ret != -1return ret;
    ret = inf;
    for (int i = pos+1; i <= n; i++) {
        if (arr[pos] < arr[i]) ret = min(ret, go(i, cnt-1+ cost[pos]);
    }
    return ret;
}
int main() {
    memset(d, -1sizeof(d));
    scanf(" %d"&n);
 
    for (int i = 1; i <= n; i++scanf(" %lld"&arr[i]);
    for (int i = 1; i <= n; i++scanf(" %lld"&cost[i]);
 
        ll ans = inf;
        for (int i = 1; i <= n; i++) ans = min(ans, go(i, 3));
 
        if (ans == inf) ans = -1;
        printf("%lld\n", ans);
    
    
}
cs