Jobdu-1499-项目安排[解题代码] | Acm之家


九度-1499-项目安排[解题代码] | Acm之家
小明每天都在开源社区上做项目,假设每天他都有很多项目可以选,其中每个项目都有一个开始时间和截止时间,假设做完每个项目后,拿到报酬都是不同的。由于小明马上就要硕士毕业了,面临着买房、买车、给女友买各种包包的鸭梨,但是他的钱包却空空如也,他需要足够的money来充实钱包。万能的网友麻烦你来帮帮小明,如何在最短时间内安排自己手中的项目才能保证赚钱最多(注意:做项目的时候,项目不能并行,即两个项目之间不能有时间重叠,但是一个项目刚结束,就可以立即做另一个项目,即项目起止时间点可以重叠)。
输入:
输入可能包含多个测试样例。
对于每个测试案例,输入的第一行是一个整数n(1<=n<=10000):代表小明手中的项目个数。
接下来共有n行,每行有3个整数st、ed、val,分别表示项目的开始、截至时间和项目的报酬,相邻两数之间用空格隔开。
st、ed、value取值均在32位有符号整数(int)的范围内,输入数据保证所有数据的value总和也在int范围内。
输出:
对应每个测试案例,输出小明可以获得的最大报酬
17    while(scanf("%d", &n) != EOF){
18        for(i=1; i<=n; i++){
19            scanf("%d %d %d", &p[i].st, &p[i].ed, &p[i].value);
20            dp[i] = 0;
21        }
22        sort(p+1, p+n+1, cmp);
23        dp[0] = 0;
24        for(i=1; i<=n; i++){
25            for(j=i-1; j>0; j--){
26                if(p[i].st >= p[j].ed)
27                    break;
28            }
29            dp[i] = dp[j] + p[i].value;
30            if(dp[i] < dp[i-1])
31                dp[i] = dp[i-1];
32        }
33        printf("%d\n",dp[n]);
34    }
http://blog.csdn.net/wdy_yx/article/details/9833897
 在动态规划更新过程中,当考虑第 i 个项目时,我们需要比较加入第i 个项目 和不加第i个项目 所能产生价值的最大值。

       1. maxP[i-1]

        表示不加第i个项目,也就是前 i-1 个项目所能产生价值的最大值。这个比较好理解。

       2.maxP[preid]+ps[i].value

       当加入第i个项目后,之前项目中和第i个项目有重叠的项目肯定就不能做了,所以我们要查找前面不和第i 个项目重叠的前preid个项目 所能产生的最大价值。
       结束时间endt<= ps[i].begt的项目不和项目i重合,
  1. struct PRO{  
  2.     int begt;  
  3.     int endt;  
  4.     int val;  
  5. public:  
  6.     PRO(int begt_,int endt_,int val_):begt(begt_),endt(endt_),val(val_){};  
  7.    
  8. };  
  9. std::vector<PRO> ps;  
  10. int maxP[10001];  
  11. int findpm(int b,int e,int t){  
  12.     int id = b-1;//Attention  
  13.     int mid;  
  14.     while(b<=e){ //ATTENTION  <=  
  15.         mid = (b+e)>>1;  
  16.         if(ps[mid].endt<=t){  
  17.             id = mid;  
  18.             b = mid+1;  
  19.         }else{  
  20.             e = mid-1;  
  21.         }  
  22.     }  
  23.     return id;  
  24. }  
  25.    
  26. bool lessThan(const PRO& pl,const PRO& pr){  
  27.     return pl.endt<pr.endt;  
  28. }  
  29. void init(int n){  
  30.     ps.clear();  
  31.     for(int i =0;i<=n;i++)  
  32.         maxP[i]=0;  
  33.    
  34.     int bt;  
  35.     int et;  
  36.     int val;  
  37.     ps.push_back(PRO(0,0,0)); //ATTENTION  
  38.     for(int i = 0;i<n;i++){  
  39.         scanf("%d %d %d",&bt,&et,&val);  
  40.         ps.push_back(PRO(bt,et,val));  
  41.     }  
  42. }  
  43. void getMax(int n){  
  44.     std::sort(ps.begin(),ps.end(),lessThan);  
  45.     for(int i = 1;i<n+1;i++){  
  46.         int preid = findpm(0,i-1,ps[i].begt);  
  47.         maxP[i] = std::max(maxP[i-1],maxP[preid]+ps[i].val);  
  48.     }  
  49.     printf("%d\n",maxP[n]);  
  50. }  
  51. void getMaxNew(int n){  
  52.     std::sort(ps.begin(),ps.end(),lessThan);  
  53.     int *dp = new int[ps.back().endt+1];  
  54.     for(int i = 1;i<n+1;i++){  
  55.         int temMax = std::max(dp[ps[i].endt],dp[ps[i].begt]+ps[i].val);  
  56.         for(int j = ps[i].endt;j<ps.back().endt+1;j++)  
  57.             dp[j] = temMax;  
  58.     }  
  59.     printf("%d\n",maxP[ps.back().endt]);  


       ***********为什么动态规划变量为时间时会产生时间超长呢*************
       为什么time output limit,本题和 题目1463:招聘会题目1434:今年暑假不AC 不同的地方在于1463、1434里面的时间为一天中的24小时,所以按照时间来动态规划的话,j的范围0<= j <=24,无论有多少个项目,dp的大小最大也为25。在本题中如果仍然按照时间来动态规划的话,j的maxT等于最晚的项目的结束时间,如果结束时间很晚的话,maxT很大,dp申请的空间也就很大,dp遍历所需时间也就长。
  1. void getMaxNew(int n){  
  2.     std::sort(ps.begin(),ps.end(),lessThan);  
  3.     int maxT = ps.back().endt;  
  4.     int *dp = new int[maxT+1];  
  5.     memset(dp,0,(maxT+1)*sizeof(int));  
  6.     for(int i = 1;i<n+1;i++){  
  7.         int temMax = std::max(dp[ps[i].endt],dp[ps[i].begt]+ps[i].val);  
  8.         for(int j = ps[i].endt;j<maxT+1;j++)  
  9.             dp[j] = temMax;  
  10.     }  
  11.     printf("%d\n",dp[maxT]);  
  12. }  
Read full article from 九度-1499-项目安排[解题代码] | Acm之家

Labels

LeetCode (1432) GeeksforGeeks (1122) LeetCode - Review (1067) Review (882) Algorithm (668) to-do (609) Classic Algorithm (270) Google Interview (237) Classic Interview (222) Dynamic Programming (220) DP (186) Bit Algorithms (145) POJ (141) Math (137) Tree (132) LeetCode - Phone (129) EPI (122) Cracking Coding Interview (119) DFS (115) Difficult Algorithm (115) Lintcode (115) Different Solutions (110) Smart Algorithm (104) Binary Search (96) BFS (91) HackerRank (90) Binary Tree (86) Hard (79) Two Pointers (78) Stack (76) Company-Facebook (75) BST (72) Graph Algorithm (72) Time Complexity (69) Greedy Algorithm (68) Interval (63) Company - Google (62) Geometry Algorithm (61) Interview Corner (61) LeetCode - Extended (61) Union-Find (60) Trie (58) Advanced Data Structure (56) List (56) Priority Queue (53) Codility (52) ComProGuide (50) LeetCode Hard (50) Matrix (50) Bisection (48) Segment Tree (48) Sliding Window (48) USACO (46) Space Optimization (45) Company-Airbnb (41) Greedy (41) Mathematical Algorithm (41) Tree - Post-Order (41) ACM-ICPC (40) Algorithm Interview (40) Data Structure Design (40) Graph (40) Backtracking (39) Data Structure (39) Jobdu (39) Random (39) Codeforces (38) Knapsack (38) LeetCode - DP (38) Recursive Algorithm (38) String Algorithm (38) TopCoder (38) Sort (37) Introduction to Algorithms (36) Pre-Sort (36) Beauty of Programming (35) Must Known (34) Binary Search Tree (33) Follow Up (33) prismoskills (33) Palindrome (32) Permutation (31) Array (30) Google Code Jam (30) HDU (30) Array O(N) (29) Logic Thinking (29) Monotonic Stack (29) Puzzles (29) Code - Detail (27) Company-Zenefits (27) Microsoft 100 - July (27) Queue (27) Binary Indexed Trees (26) TreeMap (26) to-do-must (26) 1point3acres (25) GeeksQuiz (25) Merge Sort (25) Reverse Thinking (25) hihocoder (25) Company - LinkedIn (24) Hash (24) High Frequency (24) Summary (24) Divide and Conquer (23) Proof (23) Game Theory (22) Topological Sort (22) Lintcode - Review (21) Tree - Modification (21) Algorithm Game (20) CareerCup (20) Company - Twitter (20) DFS + Review (20) DP - Relation (20) Brain Teaser (19) DP - Tree (19) Left and Right Array (19) O(N) (19) Sweep Line (19) UVA (19) DP - Bit Masking (18) LeetCode - Thinking (18) KMP (17) LeetCode - TODO (17) Probabilities (17) Simulation (17) String Search (17) Codercareer (16) Company-Uber (16) Iterator (16) Number (16) O(1) Space (16) Shortest Path (16) itint5 (16) DFS+Cache (15) Dijkstra (15) Euclidean GCD (15) Heap (15) LeetCode - Hard (15) Majority (15) Number Theory (15) Rolling Hash (15) Tree Traversal (15) Brute Force (14) Bucket Sort (14) DP - Knapsack (14) DP - Probability (14) Difficult (14) Fast Power Algorithm (14) Pattern (14) Prefix Sum (14) TreeSet (14) Algorithm Videos (13) Amazon Interview (13) Basic Algorithm (13) Codechef (13) Combination (13) Computational Geometry (13) DP - Digit (13) LCA (13) LeetCode - DFS (13) Linked List (13) Long Increasing Sequence(LIS) (13) Math-Divisible (13) Reservoir Sampling (13) mitbbs (13) Algorithm - How To (12) Company - Microsoft (12) DP - Interval (12) DP - Multiple Relation (12) DP - Relation Optimization (12) LeetCode - Classic (12) Level Order Traversal (12) Prime (12) Pruning (12) Reconstruct Tree (12) Thinking (12) X Sum (12) AOJ (11) Bit Mask (11) Company-Snapchat (11) DP - Space Optimization (11) Dequeue (11) Graph DFS (11) MinMax (11) Miscs (11) Princeton (11) Quick Sort (11) Stack - Tree (11) 尺取法 (11) 挑战程序设计竞赛 (11) Coin Change (10) DFS+Backtracking (10) Facebook Hacker Cup (10) Fast Slow Pointers (10) HackerRank Easy (10) Interval Tree (10) Limited Range (10) Matrix - Traverse (10) Monotone Queue (10) SPOJ (10) Starting Point (10) States (10) Stock (10) Theory (10) Tutorialhorizon (10) Kadane - Extended (9) Mathblog (9) Max-Min Flow (9) Maze (9) Median (9) O(32N) (9) Quick Select (9) Stack Overflow (9) System Design (9) Tree - Conversion (9) Use XOR (9) Book Notes (8) Company-Amazon (8) DFS+BFS (8) DP - States (8) Expression (8) Longest Common Subsequence(LCS) (8) One Pass (8) Quadtrees (8) Traversal Once (8) Trie - Suffix (8) 穷竭搜索 (8) Algorithm Problem List (7) All Sub (7) Catalan Number (7) Cycle (7) DP - Cases (7) Facebook Interview (7) Fibonacci Numbers (7) Flood fill (7) Game Nim (7) Graph BFS (7) HackerRank Difficult (7) Hackerearth (7) Inversion (7) Kadane’s Algorithm (7) Manacher (7) Morris Traversal (7) Multiple Data Structures (7) Normalized Key (7) O(XN) (7) Radix Sort (7) Recursion (7) Sampling (7) Suffix Array (7) Tech-Queries (7) Tree - Serialization (7) Tree DP (7) Trie - Bit (7) 蓝桥杯 (7) Algorithm - Brain Teaser (6) BFS - Priority Queue (6) BFS - Unusual (6) Classic Data Structure Impl (6) DP - 2D (6) DP - Monotone Queue (6) DP - Unusual (6) DP-Space Optimization (6) Dutch Flag (6) How To (6) Interviewstreet (6) Knapsack - MultiplePack (6) Local MinMax (6) MST (6) Minimum Spanning Tree (6) Number - Reach (6) Parentheses (6) Pre-Sum (6) Probability (6) Programming Pearls (6) Rabin-Karp (6) Reverse (6) Scan from right (6) Schedule (6) Stream (6) Subset Sum (6) TSP (6) Xpost (6) n00tc0d3r (6) reddit (6) AI (5) Abbreviation (5) Anagram (5) Art Of Programming-July (5) Assumption (5) Bellman Ford (5) Big Data (5) Code - Solid (5) Code Kata (5) Codility-lessons (5) Coding (5) Company - WMware (5) Convex Hull (5) Crazyforcode (5) DFS - Multiple (5) DFS+DP (5) DP - Multi-Dimension (5) DP-Multiple Relation (5) Eulerian Cycle (5) Graph - Unusual (5) Graph Cycle (5) Hash Strategy (5) Immutability (5) Java (5) LogN (5) Manhattan Distance (5) Matrix Chain Multiplication (5) N Queens (5) Pre-Sort: Index (5) Quick Partition (5) Quora (5) Randomized Algorithms (5) Resources (5) Robot (5) SPFA(Shortest Path Faster Algorithm) (5) Shuffle (5) Sieve of Eratosthenes (5) Strongly Connected Components (5) Subarray Sum (5) Sudoku (5) Suffix Tree (5) Swap (5) Threaded (5) Tree - Creation (5) Warshall Floyd (5) Word Search (5) jiuzhang (5)

Popular Posts