Summary:
1. Fill dp array explicitly by using dp[i] = dp[i+1]
2. At time i, do the first job explicitly
Code:
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72 |
/* * source.cpp * * Created on: Apr 5, 2014 * Author: sangs */ #include <iostream> #include <stdio.h> #include <set> #include <memory.h> #include <vector> using
namespace std; class
Job { public : int
st, ed, duration; Job( int
_st, int
_ed, int
_du):st(_st), ed(_ed), duration(_du) {} Job() { st = ed = duration = 0; } }; vector<Job> jobs[2500]; int
dp[2500]; int
cal( int
n) { memset(dp, 0, sizeof (dp)); for ( int
i = n; i >= 0; i --) { if (jobs[i].size() == 0) { dp[i] = dp[i+1]; continue ; } int
du = jobs[i][0].duration; dp[i] = du + dp[i+du]; for (size_t j = 1; j < jobs[i].size(); j ++) { du = jobs[i][j].duration; dp[i] = min(dp[i], du+dp[i+du]); } } for ( int
i = 0; i <= n; i ++) jobs[i].clear(); return
dp[0]; } int
main() { freopen( "input.txt" , "r" , stdin); int
cases, m; scanf( "%d" , &cases); while (cases --) { scanf( "%d" , &m); int
n = 0; for ( int
i = 0; i < m; i ++) { int
st, ed, du; scanf( "%d%d%d" , &du, &st, &ed); n = max(n, ed); for ( int
j = st; j <= ed-du; j ++) { jobs[j].push_back(Job(st, ed, du)); } } int
res = cal(n); printf( "%d\n" , res); } return
0; } |
POJ 1337 A Lazy Worker,布布扣,bubuko.com
原文:http://www.cnblogs.com/zhouzhuo/p/3647657.html