POJ1036 Gangsters
题目来源:http://poj.org/problem?id=1036
题目大意:
有N个强盗要进入一家饭店打劫,第i个强盗在Ti时刻到达,会抢到Pi的财产。饭店的门有K+1状态,门打开的程度为[0,K]。0表示门完全关闭。每过一个单位时间,门可以打开或合上一个单位,或保持不变。初始时刻店门紧闭。第i个强盗只能在门打开的状态为Si时才能进入饭店,Si表示第i个强盗的体型。如果强盗到达饭店时,他不能进入饭店,他将离开不再回来。饭店的营业时间是[0,T]。程序的目标是控制门的开关,使强盗可以获得最多的财产。
输入:第一行3个整数N、K、T(1<=N<=100, 1<=K<=100, 0<=T<=30000)
第二行表示每个强盗到达时间T1,...TN,第三行表示每个强盗能获得的财产P1,...PN,第四号表示每个强盗的体型S1,..SN
输出:强盗能获得的最大财产数。
Sample Input
4 10 20 10 16 8 16 10 11 15 1 10 7 1 8
Sample Output
26
一维动态规划的方法:
1 ////////////////////////////////////////////////////////////////////////// 2 // POJ1036 Gangsters 3 // Memory: 284K Time: 0MS 4 // Language: C++ Result: Accepted 5 ////////////////////////////////////////////////////////////////////////// 6 7 #include <iostream> 8 #include <algorithm> 9 10 using namespace std; 11 12 struct Ganster { 13 int t; 14 int p; 15 int s; 16 }; 17 Ganster g[101]; 18 int N, K, T; 19 int dp[101]; 20 int ans = 0; 21 bool visited[101]; 22 inline bool operator<(const Ganster & p1, const Ganster & p2) { 23 return p1.t == p2.t ? (p1.s == p2.s ? p1.p < p2.p : p1.s < p2.s) : p1.t < p2.t; 24 } 25 int main() { 26 cin >> N >> K >> T; 27 for (int i = 1; i <= N; ++i) { 28 cin >> g[i].t; 29 } 30 for (int i = 1; i <= N; ++i) { 31 cin >> g[i].p; 32 } 33 for (int i = 1; i <= N; ++i) { 34 cin >> g[i].s; 35 } 36 sort(g, g + N + 1); 37 g[0].t =g[0].p = g[0].s = 0; 38 visited[0] = true; 39 for (int i = 1; i <= N; ++i) { 40 for (int j = 0; j < i; ++j) { 41 if (visited[j]) { 42 if (g[i].t - g[j].t >= abs(g[i].s - g[j].s)) { 43 dp[i] = max(dp[i], dp[j] + g[i].p);//更新放i进去能获得的最大财产 44 } 45 } 46 } 47 visited[i] = (bool)dp[i]; 48 ans = max(ans, dp[i]); 49 } 50 cout << ans << endl; 51 system("pause"); 52 return 0; 53 }